链表是数据结构的重要内容,在计算机程序中应用广泛,同时也是各公司笔试题目的重点。
以下简单实现了链表的一些操作,包括创建、增加节点、删除节点、单链表逆置、合并有序链表等。
一、链表创建
链表主要有三种形式,包括单链表、双链表和循环链表。
单链表每个节点只包含一个后驱指针,双链表节点同时包含一个前驱指针和一个后驱指针,循环链表的尾节点的后驱指向头节点。
代码如下:
/*单链表节点结构*/
typedef structNodeType
{
char elem;
NodeType*next;
}Node;
/*双链表节点结构*/
typedef structDNodeType
{
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;
}
/*创建双链表*/
DNode* DoubleList(DNode*head)
{
if(NULL== head)//分配头节点空间
head=(DNode*)malloc(sizeof(DNode)) , head->prev=NULL ,head->next=NULL;
DNode*current=head ,*temp;
char ch;
while(1)
{
cout<<"\n input elem:";
cin>>ch;
if('#' == ch)/*#结束输入*/
break;
temp=(DNode*) malloc (sizeof(DNode) );
temp->elem=ch;
temp->next=NULL;
current->next=temp;/*当前节点的后驱指向新节点*/
temp->prev=current;/*新节点的前驱指向当前节点*/
current=temp;/*当前节点为链表尾节点*/
}
return head;
}
/*创建循环链表*/
Node* CycleList(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;/*当前节点为链表尾节点*/
}
current->next=head;/*尾节点指向头节点*/
return head;
}
二、链表操作
包括单链表的增加节点、删除节点、输出链表等
添加节点
/*在尾部插入节点#add 可以直接在指定参数节点插入*/
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)/*匹配节点元