- 1、本文档共54页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
“数据结构[C版][第二版]”第02章
第2章 线性表 ;2.1 线性表的定义及其运算;2.线性表的特征;2.1.2 线性表的运算;2.1.3 线性表的抽象数据类型描述;【例2-1】假设线性表L=(23,56,89,76,18),i=3,x=56,y=88,则对L的一组操作及结果如下:
;2.2 线性表的顺序存储结构;从上面的公式可知,该存储结构类似于高级语言中的一维数组存储结构(即向量结构),适合于随机访问,于是可用C++语言描述为:;在上述描述中,a为一个数组类型,第一个元素为a[0]而非a[1],因为C++中数组的下标是从0开始而非1开始。存储空间从a[0]~a[maxsize-1],而不是从a[1]~a[maxsize],不能使用a[maxsize]。为了与我们的a1对应,建议从a[1]开始使用元素,将a[0]存储单元浪费掉,这样给我们的操作带来较大方便(以后使用不再声明),当然,一般情形下,不应该浪费a[0]存储单元,这可根据具体情形来定。;2.插入运算Insert(L,x,i)
要将x插入到顺序表L的第i个位置,可分三种情形考虑:
(1)i位置超过表长,发生溢出,不能插入;
(2)i值非法,不能插入;
(3)i值合法,进行插入。;分析该算法的执行效率:;该算法的运行时间主要花费在元素前移上,和刚才的插入算法类似,平均移动次数为 ,故时间复杂度为O(n)。顺序表上的删除运算平均移动元素次数也将近为表长的一半,当n较大时,算法的效率相当低。;5.定位算法Locate(L,x);2.2.3 顺序表存储空间的动态分配;在此时,只有线性表置空表算法需要修改,其他算法都与静态分配相同。;2.3 线性表的链式存储结构;【例2-2】设有一个线性表(a1,a2,a3,a4,a5,a6),在内存中的存放形式见下图。首先用头指针存放第一个元素的地址,然后每个结点的指针域存放下一个元素地址,最后一个结点的指针域为空,表示没有后继元素,设为NULL或^。;单链表可用C++描述为:;2.3.2 单链表运算;但是,为了便于实现各种运算,通常在单链表的第一个结点之前增设一个附加结点,称为头结点,其他结点称为表结点。;建立带头结点的链表,算法为: ;2.尾插法建立单链表(从右边插入结点);(2)带头结点的算法 ;比较上面两种算法可以发现,建立不带头结点的单链表,必须进行空表与非空表两种情形的区分(循环中用if语句),而建立带头结点的单链表,则可省去这种判断。;3.单链表上的查找运算;(2)按序号查找get(head,i)
在带头结点的单链表head中查找第i个位置上的元素,若找到,则返回它的地址,否则返回NULL。;;5.单链表上的删除运算;6.输出单链表;2.3.3 循环链表结构;循环链表上的运算与单链表上的运算基本一致,区别只在于最后一个结点的判断(即循环的条件不同),但利用循环链表实现某些运算较单链表方便(从某个结点出发能求出它的直接前驱,而单链表是不行的,只能从头出发)。;既然是循环链表, head指针就可以指向任意结点,若将head指向末尾,有时的操作会比head指向开头的操作更方便,下面将举例说明。;对第一种合并算法,可以分三步走:;2.3.4 双向链表结构;在双向链表中,若涉及的运算仅用到一个方向的指针,则双向链表中的运算与单链表中算法一致。例如查找、输出等运算,与单链表中运算一致。若运算涉及两个方向的指针,则与单链表中的算法不同,例如插入、删除运算。;2.双向链表插入运算dbinsert (head,x,y);因为双向链表有两个方向的指针,故查找也可以从后往前进行,请读者自己修改算法中查找部分程序,使之从后往前查找。无论是哪种查找,时间复杂度都为O(n),而该算法花费的时间主要是在查找方面,故该算法的时间复杂度为O(n)。;2.4 一元多项式的表示及相加;2.4.2 一元多项式的相加;两个链表A(x)=7+3x+9x8+5x17和B(x)=8x+22x7-9x8相加的过程见下图 ;2.算法实现;//头插法建立带头结点的单链表; poly *poly::add(poly *A,poly *B) //多项式相加
{ poly *p,*q,*pre,*C,*u;
p=A-next;q=B-next;
pre=A;C=A; ; void main()
{ poly *A,*B,*C, a;
A=a.hcreat(); //头插法建立第一个多项式链表
B=a.hcreat(); //头插法建立第二个多项式链表
C=a.add(A,B); //多项式相加
};1.基于存储空间的考虑;2.基于时间的考虑;2.6 算法应用举例;【例2-6
您可能关注的文档
最近下载
- 2022年注册测绘师法律法规重点记忆手册.pdf
- 玻璃雨棚施工方案.docx VIP
- 四川省达州市大竹县中考二模数学试题含解析.docx VIP
- 沪教牛津版六年级下册英语沪教牛津版Module4测试卷.docx VIP
- 2024-2025学年度甘肃省合作市中考数学真题分类(一次函数)汇编专项测试练习题(解析版).docx
- (初中数学)典型中考数学动点问题试题专题复习讲解汇总.doc VIP
- 护理读书的报告范文的共篇.doc VIP
- 沪教牛津版六年级下册英语沪教牛津版期末测试卷.docx VIP
- 国家开放大学《建筑工程质量检验》章节测试参考答案.pdf
- 四川省达州市大竹县2025年初三最后一考数学试题试卷含解析.doc VIP
文档评论(0)