知识大全 线性表- 链式存储结构- 双链表

Posted 结点

篇首语:多见者博,多闻者智,拒谏者塞,专己者孤。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 线性表- 链式存储结构- 双链表相关的知识,希望对你有一定的参考价值。

   双向链表(Double Linked List)

  双(向)链表中有两条方向不同的链 即每个结点中除next域存放后继结点地址外 还增加一个指向其直接前趋的指针域

  prior

  

>

  注意

  ①双链表由头指针head惟一确定的

  ②带头结点的双链表的某些运算变得方便

  ③将头结点和尾结点链接起来 为双(向)循环链表

   双向链表的结点结构和形式描述

  ①结点结构(见上图a)

  ②形式描述

  typedef struct dlistnode

  DataType data;

  struct dlistnode *prior *next;

  DListNode;

  typedef DListNode *DLinkList;

  DLinkList head;

   双向链表的前插和删除本结点操作

  由于双链表的对称性 在双链表能能方便地完成各种插入 删除操作

  ①双链表的前插操作

  

>

  void DInsertBefore(DListNode *p DataType x)

  //在带头结点的双链表中 将值为x的新结点插入*p之前 设p≠NULL

  DListNode *s=malloc(sizeof(DListNode));//①

  s >data=x;//②

  s >prior=p >prior;//③

  s >next=p;//④

  p >prior >next=s;//⑤

  p >prior=s;//⑥

  

  ②双链表上删除结点*p自身的操作

  

>

  void DDeleteNode(DListNode *p)

  //在带头结点的双链表中 删除结点*p 设*p为非终端结点

  p >prior >next=p >next;//①

  p >next >prior=p >prior;//②

  free(p);//③

  

  注意

  与单链表上的插入和删除操作不同的是 在双链表中插入和删除必须同时修改两个方向上的指针

  上述两个算法的时间复杂度均为O( )

cha138/Article/program/sjjg/201311/23300

相关参考