2020第二章线性表3循环链表双向链表.pptVIP

  • 1
  • 0
  • 约2.02千字
  • 约 19页
  • 2020-12-07 发布于天津
  • 举报
数据结构 2.3 线性表的链式存储表示和实现 四、循环链表 p L a 1 a i -1 a i a n ∧ 从单链表中某结点 p 出发如何找到其前驱? 将单链表的首尾相接,将终端结点的指针域由空指针 改为指向头结点,构成 单循环链表 ,简称 循环链表 。 说明 ①循环链表中增设了表头结点,统一了空表 和非空表的运算; 空循环链表 L 非空循环链表 a 1 a i -1 a i a n L 说明 ②从循环链表中的任何一个结点的位置 都可以找到其他所有结点,而单链表做 不到; 循环链表中没有明显的尾端 如何避免死循环 循环条件: p!=NULL ? p!=L p-next!=NULL ? p-next!=L a 1 a i -1 a i a n L 说明 ③对循环链表,有时不给出头指针,而是 给出尾指针,可以更方便的找到线性表的 第一个元素和最后一个元素结点。 a 1 a i -1 a i a n rear 如何查找开始结点和终端结点? 开始结点: rear-next-next 终端结点: rear 例如:将两个链表首尾相连: a 1 a n Ta b 1 b n Tb Ta a 1 a n b 1 b n Tb 说明 ④循环链表与线性链表操作的主要差别是 算法中循环结束的条件。 L 判空条件: L-next==NULL; 判空条件: H==H-next; 判空条件: rear==rear-next; H rear p 举例 ① a 1 ③ a n Ta ② b 1 b n ④ Tb a 1 a n Ta b 1 b n Tb p 举例 ① a 1 ③ a n Ta ② b 1 LinkList Connect(LinkList Ta,LinkList Tb) {// 假设 A 、 B 都是非空的单循环链表 b n ④ Tb p=Ta-next; ① p 存表头结点 // Ta-next=Tb-next-next; ② Tb 表头连结 Ta 表尾 // free(Tb-next); ③释放 Tb 表头结点 // Tb-next=p; ④修改指针 // return Tb; } 2.3 线性表的链式存储表示和实现 五、双向链表 p L a 1 a i -1 a i a n ∧ 如何求结点 p 的直接前驱,时间性能? 为什么可以快速求得结点 p 的后继? 如何快速求得结点 p 的前驱? 2.3 线性表的链式存储表示和实现 五、双向链表 特点: 有两个指针域,一个指向直接后继,另一 个指 向直接前趋。 L 结点结构: prior A B C ∧ data next data :数据域,存储数据元素; prior :指针域,存储该结点的前趋结点地址; next :指针域,存储该结点的后继结点地址。 2.3 线性表的链式存储表示和实现 五、双向链表 L A B C ∧ typedef struct DuLNode{ ElemType data; struct DuLNode *prior; struct DuLNode *next; }DuLNode, *DuLinkList; L A B C ∧ 非空的双向链表 L A B C 非空的双向循环链表 理解 d-next-prior=d-prior-next=d 2.3 线性表的链式存储表示和实现 五、双向链表 ? 双向链表的插入运算 p A ① C ② ④ ③ B s

文档评论(0)

1亿VIP精品文档

相关文档