一、链表创建
链表主要有三种形式,包括单链表、双链表和循环链表。
单链表每个节点只包含一个后驱指针,双链表节点同时包含一个前驱指针和一个后驱指针,循环链表的尾节点的后驱指向头节点。
代码如下:
/*单链表节点结构*/
typedef struct NodeType
{
char elem;
NodeType *next;
}Node;
/*双链表节点结构*/
typedef struct DNodeType
{
char elem;
DNodeType *next;
DNodeType *prev;
}DNode;/*
创建链表
*/
Node * CreateList(Node *head)
{
if(NULL == head)//分配头节点空间
head=(Node*)malloc(sizeof(Node)),
head->next=NULL;
Node *current=head , *temp;
char ch;
while(1)
{
cout<<"/n input elem:";
cin>>ch;
if('#' == ch) /*#结束输入*/
break;
temp=(Node *) malloc ( sizeof(Node) );
temp->elem=ch;
temp->next=NULL;
current->next=temp; /*当前节点的后驱指向新节点*/
current=temp; /*当前节点为链表尾节点*/
}
return head;
}/*插入节点*/
Node *InsertNode(Node *head , char elem)
{
if( NULL == head || NULL == elem )
return head;
Node *current=head->next; /*当前节点*/
Node *prev=head; /*前驱节点*/
Node *temp; /*过渡节点*/
while(current) /*移动至尾节点*/
{
prev=current;
current=current->next;
}
temp=(Node*) malloc( sizeof(Node) );
temp->elem=elem;
temp->next=NULL;
prev->next=temp; /*尾节点的后驱指向新节点*/
return head;
}/*删除节点*/
Node *DeleteNode(Node *head,char elem)
{
if(NULL == head || NULL == elem)
return head;
if(NULL == head->next)
return head;
Node *prev,*current;
prev=head;
current=head->next;
while(current)
{
if(current->elem == elem) /*匹配节点元素*/
{
prev->next=current->next; /*前驱节点的后驱指向当前节点的下一个节点*/
free(current); /*释放当前节点*/
return head;
}
prev=current;
current=current->next; /*移动至下一个节点*/
}
return head;
}/*
输出链表
*/
void PrintList(Node *head)
{
Node * current=head->next;
cout<<"/n List are:";
while(NULL != current)
{
if(NULL != current->elem)
cout<<setw(5)<<current->elem;
current=current->next;
}
cout<<"/n";
}