数据结构第2章【荐】.pptVIP

  1. 1、本文档共18页,可阅读全部内容。
  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文档。上传文档
查看更多
数据结构第2章【荐】.ppt

* * 2.3.2 循环链表 最后一个结点的指针域的指针又指回第一个结点的链表 单循环链表:在单链表中,将终端结点的指针域NULL改为指向表头结点的,就得到了单链形式的循环链表,并简单称为单循环链表。 为了使空表和非空表的处理一致,循环链表中也可设置一个头结点。这样,空循环链表仅有一个自成循环的头结点表示。如下图所示: a1 an …. head ⑴ 非空表 ⑵ 空表 在用头指针表示的单链表中,找开始结点a1的时间是O(1),然而要找到终端结点an,则需从头指针开始遍历整个链表,其时间是O(n) 两个用尾指针标识的单循环链表的连接 R2 b1   bn … × a1   an … R1 × p 两个单循环链表H1 、H2的连接操作,是将H2的第一个数据结点接到H1的尾结点,而链表若用尾指针R1 、R2来标识,则时间性能为O(1)。 2.3.3双向链表 双向链表(Double linked list):在单链表的每个结点里再增加一个指向其直接前趋的指针域prior。这样就形成的链表中有两个方向不同的链,故称为双向链表。形式描述为: typedef struct DuLNode { ElemType data; // 数据域 struct DuLNode *prior; // 指向前驱的指针域 struct DuLNode *next; // 指向后继的指针域 } DuLNode, *DuLinkList; prior next data 设指针p指向某一结点,则双向链表结构的对称性可用下式描述: (p—prior)—next=p=(p—next)—prior 即结点*p的存储位置既存放在其前趋结点*(p—prior)的直接后继指针域中,也存放 在它的后继结点*(p—next)的直接前趋指针域中。 带头结点的双循环链表 (b)空表 H (a)非空表 … H a2 a1 an 双向链表的前插操作算法如下: void ListInsert_dul(DulinkList L,int i,Elemtype x) { if (!(p=GetElemP_DdL(L,i))) return ERROR; //确定在L中第I个元素的位置指针。 //p为NULL时,即第I 个元素不存在。 if (!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR; S—data=x; S—prior=p—prior; p—prior—next=S; S—next=p; p—prior=S; }     双向链表中的结点插入 p × × ① ② ③ ④ 双向链表中结点的删除: 设p指向双向链表中某结点,删除*p。 操作示意图: 操作如下: ①p-prior-next=p-next; ②p-next-prior=p-prior; free(p); p × × ① ② 注意:与单链表的插入和删除操作不同的是,在双链表中插入和删除必须同时修改两个方向上的指针。上述两个算是法的时间复杂度均为O(1)。 静态链表 #define MAXSIZE … /*足够大的数*/ typedef struct {datatype data; int next; }SNode; /*结点类型*/ SNode sd[MAXSIZE]; int SL,AV; /*两个头指针变量*/ 这种链表的结点中也有数据域data和指针域next,与前面所讲的链表中的指针不同的是,这里的指针是结点的相对地址(数组的下标),称之为静态指针,这种链表称之为静态链表. 顺序表和链表的比较 顺序存储优缺点: (1) 方法简单,各种高级语言中都有数组,容易实现。 (2) 不用为表示结点间的逻辑关系而增加额外的存储开销。 (3) 顺序表具有按元素序号随机访问的特点。 但它也有两个缺点: (4)??在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此对n较大的顺序表效率低。 (5) 需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置;预先分配过小,又会造成溢出。 链表的优缺点恰好与顺序表相反。在实际中怎样选取存储结构呢?通常有以下几点考虑: 1. 基于存储的考虑 可见对线性表的

文档评论(0)

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

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档