链表的常见操作

               

链表是数据结构的重要内容,在计算机程序中应用广泛,同时也是各公司笔试题目的重点。

以下简单实现了链表的一些操作,包括创建、增加节点、删除节点、单链表逆置、合并有序链表等。

一、链表创建

  链表主要有三种形式,包括单链表、双链表和循环链表。

  单链表每个节点只包含一个后驱指针,双链表节点同时包含一个前驱指针和一个后驱指针,循环链表的尾节点的后驱指向头节点。

  代码如下:

 /*单链表节点结构*/
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)/*匹配节点元

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值