数据结构 第2章 线性表(2).pptVIP

  1. 1、本文档共40页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单链表结构的尴尬 假设我们的校园只有单行道 保安沿这条路线巡逻,需要查遍所有地点。有一天,保安先从主楼群出发,想把以上地点走一遍,此时主管告诉他,不行,你必须从北门开始走。。。 * * 事实上,把主校门和北门连接起来,形成一个环路,就解决了这个问题。 循环链表 将单链表中末尾结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表成为循环链表(circular linked list)。 * * a1 an 头指针 【和单链表的主要区别】判断遍历结束的条件,原来是判断p-next是否为空,现在则是p-next是否等于头结点。 a1 a2 an 尾指针 【思考】为什么用尾指针表示循环链表更方便?(提示:我们经常需要访问的结点是头结点和末尾结点) 头指针 两个循环链表的合并 * * a1 a2 an rearA *rearA-next b1 b2 bm rearB *rearB-next *rearB-next-next (1) p = rearA-next; (2) q = rearB-next; (3) rearA-next = rearB-next-next; (4) rearB-next = p; (5) free(q); a1 a2 an rearA *rearA-next b1 b2 bm rearB *rearB-next-next *p p q (1) (3) (4) (2) (5) 双向链表 终于有一天,保安在感叹:如果我们有双行道该多好啊! 双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。 * * // 双向链表的结构代码 typedef struct DulNode { ElemType data; Struct DulNode *prior; struct DulNode *next; } DulNode; typedef DulNode *DuLinkList; 【注意】对双向链表中的某结点p,它的后继结点的前驱,以及前驱结点的后继都是它自己。即 p-next-prior 等价于 p-prior-next 等价于 p 【思考】对求链表长度,查找元素的操作,多一个指针有帮助吗? 双向循环链表 * * 头指针 双向的带头结点的循环链表空链表: 双向的带头结点的循环链表非空链表: 头指针 a1 a2 an 双向链表的插入 * * ai+1 *p e *s *p-next ai (1) (2) (3) (4) s-prior = p; /* 把p赋值给s的前驱,如图中(1) */ s-next = p-next; /* 把p-next赋值给s的后继,如图中(2) */ p-next-prior = s; /* 把s赋值给p-next 的前驱,如图中(3) */ p-next = s; /* 把s赋值给p的后继,如图中(4) */ 假设存储元素e的结点为s,要将s插入到p和p-next之间 双向链表的删除 * * ai+1 *p *p-next ai p-prior-next = p-next; /* 把p-next赋值给p-prior的后继,如图中(1) */ p-next-prior = p-prior; /* 把p-prior赋值给p-next的前驱,如图中(2) */ free(p) /* 释放结点,如图中(3) */ ai-1 *p-prior (1) (2) (3) 假设要删除图中的结点p 静态链表 不用指针而用数组描述的链表叫做静态链表。 * * 0 1 下标: 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 999 0 … … 数组第一个元素的cur用来存放 备用链表第一个结点的下标 cur data 数组最后一个元素的cur用来存放第一个 插入元素的下标,相当于头结点 // 静态链表的结构代码 #define MAXSIZE 1000 typedef struct { ElemType data; int cur; }Component,StaticLinkList[MAXSIZE]; /* 将一维数组space中各分量连成备用链表,*/ /* space[0].cur为头指针,“0”表示空指针 */ Status InitList(StaticLinkList space) { int i; for (i=0; iMAXSIZE-1; i++) space[i].cur = i+1; /* 目前链表为空,最后一个元素

文档评论(0)

jdy261842 + 关注
实名认证
文档贡献者

分享好文档!

1亿VIP精品文档

相关文档