第三章 双向链表

本文详细介绍了双向链表的定义,包括其结构特点和对称性,并展示了双向链表插入和删除的基本操作。同时,对比了单链表、循环链表和双向链表在查找表头、表尾、前驱结点等操作上的时间效率差异。最后,探讨了顺序表和链表在不同场景下的优缺点。
摘要由CSDN通过智能技术生成

3.8.1 双向链表定义

双向链表:在单链表的每个结点中,再设置一个指向其前驱结点的指针域。

双向链表的结构定义如下:

typedef struct DuLNode{
  Elemtype data;
  struct DuLNode *prior,*next; /*直接前驱结点*/
}DuLNode,*DuLinkList;          /*直接后继结点*/

 

双向链表结构的对称性(设指针p指向某一结点):

p->prior->next = p =p->next->prior;

3.8.2 双向链表的一些基本操作

双向链表的插入:

void Listlnsert_Dul(DuLinklist &L,int i,ElemType e){
//在带头结点的双向循环链表L中第i个位置之前插入元素e
  if(!(p=GetElemP_DuL(L,i))) 
  return ERROR;
  s=(DuLinkList)malloc(sizeof(DuLinkList));//分配空间
  s->data=e;  
  s->prior=p->prior;
  p->prior->next=s;
  s->next=p;
  p->prior=s;
 }

 双向链表的删除:

1.p-> prior>next=p->next; 2.p->next->prior=p->prior

void ListDelete_DuL(DuLink &L,int i,ElemType &e){
  //删除带头结点的双向循环链表L的第i个元素,并用e返回。
 if(!(p=GetElemP_DuL(L,i)))
 return ERROR;
 e=p->data;
 p->prior->next=p->next;
 p->next->prior=p->prior;
 free(p);
}

3.8.2 单链表、循环链表、双向链表的时间效率比较

查找表头结点

(首元结点)

查找表尾结点查找结点*p的前驱结点
带头结点的单链表

    L->next

时间复杂度O(1)

从L->next依次向后遍历

    时间复杂度O(n)

通过p->next无法找到其前驱

带头结点仅设头指

 针L的循环单链表

    L->next

时间复杂度O(1)

从L->next依次向后遍历

   时间复杂度O(n)

通过p->next可以找到其前驱

        时间复杂度O(n)

带头结点仅设尾指

针R的循环单链表

    R->next

时间复杂度O(1)

                 R

      时间复杂度O(1)

通过p->next可以找到其前驱

         时间复杂度O(n)

带头结点的双向循

链表L

     L- >next

时间复杂度O(1)

             L-> prior

      时间复杂度O(1)

                p->prior

        时间复杂度O(1)

3.8.3 顺序表和链表的比较

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值