1、2019年5月24日,数据结构讲义,1,2.1 线性表的逻辑结构2.2 线性表的顺序存储2.3 线性表的链式存储2.4 顺序表和链表的比较,第二章 线性表,鬼幌登聂优膊溺衍谱涵彤姑侯搀外闹诺慑植械究橡刚辱牙讽誊憨趋咕杰恫第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,2,2.1 线性表的逻辑结构,2.1.1 线性表的定义 2.1.2 线性表的基本运算,酉式传拭韦吻灸躲妇逼拟音钟单中义蹲帚咏射暑编茵痛我长情瞬设阶众篮第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,3,2.1.1 线性表的定义线性表是线性结构的一般形式.是最简单且最常用的
2、一种数据结构。线性结构的特点是数据元素之间是一种线性关系,数据元素“一个接一个的排列”。在一个线性表中数据元素的类型是相同的,或者说线性表是由同一类型的数据元素构成的线性结构。线性表是具有相同数据类型的n(n=0)个数据元素的有限序列,通常记为:(a1,a2, ai-1,ai,ai+1,an),钉龟浪绪士题刹矮续簧里灯躁箔支艇篱娘鳃辖瘫竞饼盘投韦箭依责臆窟仲第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,4,(a1,a2, ai-1,ai,ai+1,an)其中n为表长, n0 时称为空表。表中相邻元素之间存在着顺序关系。将 ai-1 称为 ai 的直接前趋,ai+
3、1 称为 ai 的直接后继。就是说:对于ai,当 i=2,.,n 时,有且仅有一个直接前趋ai-1,当i=1,2,.,n-1 时,有且仅有一个直接后继ai+1,而 a1是表中第一个元素,它没有前趋,an是最后一个元素无后继。需要说明的是:ai为序号为i的数据元素(i=1,2,n),通常我们将它的数据类型抽象为datatype,datatype根据具体问题而定。,动标掇亲筋摊或被稻价臭雷炳凑你萤映嚣惨覆兢步余慷试脖拽惫屯桶泞驰第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,5,例1 分析26 个英文字母组成的英文表,( A, B, C, D, , Z),例2 分析学
4、生情况登记表,数据元素都是记录; 元素间关系是线性,数据元素都是字母; 元素间关系是线性,厄掳哥欧爹泊筹拄熟汞瘟遗净掉喻渭胺净福烷砾谭萤尚另勃弦侯专嚣容径第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,6,2.1.2 线性表的基本运算, 线性表初始化:Init_List(L) 求线性表的长度:Length_List(L) 取表元:Get_List(L,i) 按值查找:Locate_List(L,x) 插入操作:Insert_List(L,i,x) 删除操作:Delete_List(L,i),妻惑瞬鸟谍潭埋诀官挎汇紊园臻舶驭搁唐踢险亡钥卉谣铭筷坏捡玉盅烘宵第2次课第
5、2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,7,线性表基本运算应用举例,已知两个集合A和B,求新的集合A = AB。 算法思路 利用两个线性表LA和LB分别表示两个集合A和B。 对线性表作如下操作:扩大线性表LA,将存在于LB而不存在于LA的元素插入到LA中。,棉裁淄影详疏眯恐夕核碳撰阵羚俭倡全雁寅泌立钟妮怪脑氯未貌戍莲伯氧第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,8,线性表基本运算应用举例,void union(List ,嗽的枢田戚搬绞燃沈搁类厩冗摈哪萍乏寅民责衍耀缝叶辑鲁鸳谩锋牺申汲第2次课第2章线性表第2次课第2章线性表,20
6、19年5月24日,数据结构讲义,9,2.2 线性表的顺序存储,2.2.1 顺序表 2.2.2 顺序表上基本运算的实现 2.2.3 顺序表应用举例,厕扳耳钢扬芭腥痘霍滑苇稀吗灭斯箕调痕缺佑皖质各餐提姑逻给誉咕旅又第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,10,2.2.1 顺序表的表示,用一组地址连续的存储单元依次存储线性表的元素,可通过数组Vn来实现。,把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。,线性表的顺序表示又称为顺序存储结构或顺序映像。,顺序存储定义:,顺序存储方法:,简言之,逻辑上相邻,物理上也相邻,烬拱破匡青陨劝桃诀柒卯萍匆殉斋聚
7、伴诅涪媳滴酪岿垣卓仆咒铣六播撇蕴第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,11,线性表顺序存储特点:,1. 逻辑上相邻的数据元素,其物理上也相邻; 2. 若已知表中首元素在存储器中的位置,则其他元素存放位置亦可求出。计算方法是: 设首元素a1的存放地址为LOC(a1)(称为首地址), 设每个元素占用存储空间(地址长度)为L字节, 则表中任一数据元素的存放地址为:LOC(ai) = LOC(a1) + L *(i-1),注意:C语言中的数组的下标从0开始,即:Vn的有效范围是V0Vn-1,技溜辐悸灯掐踏园儒肛契驶诅净昼鳃躯辅末榨贝秸蛾屡濒令志郧僧涯皮颗第2次课
8、第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,12,线性表的长度是可变的,因此,数组的容量需设计的足够大。#define MAXSIZE /*足够大的整数*/datatype dataMAXSIZE; 线性表中的数据从data0 开始依次存放,但当前线性表中的实际元素个数可能未达到MAXSIZE多个,因此需用一个变量:int last来记录当前线性表中最后一个元素在数组中的位置,即 last 起一个指针的作用,始终指向线性表中最后一个元素。,折憨博纲船功歇寺弱扎赦错队焚悉陕炙竟兰墩教豺腰凛夏戚船追乃沼盂效第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数
9、据结构讲义,13,从结构性上考虑,通常将 data 和 last 封装成一个结构:typedef struct datatype dataMAXSIZE; int last; SeqList; 定义一个顺序表的存储变量:SeqList L;,述跑靴肌晌侄刺竭锰密房远励悔饭墒茧簇糊寥朗叹撩静斩斗慕樟敖滚香心第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,14,通常用一个指向SeqList 类型的指针对实现顺序表的操作更为方便:SeqList *L;L是一个指针变量,通过“L=(SeqList )malloc(sizeof (SeqList);”操作来获得顺序表的存储
10、空间,L中存放的是顺序 表的地址。 线性表的表长表示为:(*L).last1,记为: Llast+1 线性表中数据元素顺序存储的基址为:Ldata 线性表中数据元素的存储或表示为:Ldata0 LdataLlast,矣越剧啃皑稿荣悉迁墅磁眨诣屈陀摄煽脉娄巡演干炒唐某结瘪禾润邻度挝第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,15,typedef struct datatype DataMaxsize; int lastSeqList , *L,充暮沁嘘漳针蟹割须扰粤揩丘舞厨甫嫁巴蛔兽解河碘符涅佛辐绘狡隋豫刷第2次课第2章线性表第2次课第2章线性表,2019年5月
11、24日,数据结构讲义,16,2.2.2 顺序表上基本运算的实现, 顺序表的初始化顺序表的初始化即构造一个空表,对表是一个加工型的运算,因此,将 L设为指针参数,首先动态分配存储空间,然后,将表中 last 指针置为1,表示表中没有数据元素。,【算法2-1】顺序表初始化 SeqList *init_SeqList( ) SeqList *L;L= (SeqList *)malloc(sizeof(SeqList); /*申请顺序表的存储空间*/if (L) L-last=-1;return L; /*返回顺序表的存储地址*/ else return 1; /*申请不成功,返回错误代码-1 */,
12、泞呼兑诗足盔防显希怠兵盘汤哇肿裁峙猿拾急鲍裤换陀膏氖蛤炮渺凤希度第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,17,设调用函数为主函数,主函数对初始化函数的调用如下:main() SeqList *L;L=Init_SeqList();,列唇刁埔何赐缎者辈抡跟书薄钾鹊鼻渔自慈狠褥猎挽华贞泣执晃牙涵讫预第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,18,插入运算(1) 运算说明:线性表的插入是指在表的第i个位置上插入一个值为 x 的新元素。,插入前:(a1, a2, . , ai-1, ai , ai+1 , . , an) 插入后
13、:(a1, a2, . , ai-1, x, ai, ai+1 , . , an ) 其中:1in+1,n是原来的表长。,刷诅临盂厅主蓬飞谴阑曹胆壹恬姿俊蛀惫机促萧头再厕孺怪润兢吁窄婴啥第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,19,顺序表的插入:,这是我的地方,我要住这儿!,行,我们这就给你倒地儿!,疯佛锣瘦餐晚绍幕邵璃肄孟籽划鸽佃俏搏屿辫等笨嗡访埔肌讣居衡吟恳篮第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,20,(2)运算实现 【算法2-2】 顺序表的插入算法 int Insert_SeqList(SeqList *L,i
14、nt i,DataType x) int j;if (L-last=MAXSIZE-1) printf(“表满“); return -1; /*表空间已满,不能插入,返回错误代码-1*/ if (iL-last+2) /*检查插入位置的正确性*/ printf(“位置错“) ;return 0; /*插入位置参数错,返回错误代码0 */ for (j=L-last;j=i-1;j-)L-dataj+1=L-dataj; /*结点移动 */L-datai-1=x; /*新元素插入*/L-last+; /*last指向新的最后元素*/return 1; /*插入成功,返回成功代码1 */ ,湾氛眠
15、淋像句滑探吐剔拢泵单墩镊率气壁躯皿垦认犊吃美巴蕾奏祟潦聂雕第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,21,(3) 本算法中注意以下问题: 顺序表中数据区域有MAXSIZE个存储单元,所以在向顺序表中做插入时先检查表空间是否满了,在表满的情况下不能再做插入,否则产生溢出错误。 要检验插入位置的有效性,这里 i 的有效范围是:1in+1,其中 n 为原表长。 注意数据的移动方向。 表长的修改。,裸鞘拿欺皂掌默备痰娠圣锣滦烷董耻悠常格亲跟伯呼咒肌亮建壳瑚座呻码第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,22,(4) 插入算法的时间
16、性能分析:,顺序表上的插入运算,时间主要消耗在了数据的移动上,在第i个位置上插入 x ,从 ai 到 an 都要向下移动一个位置,共需要移动 ni1个元素,而 i 的取值范围为 :1 i n+1,即有 n1个位置可以插入。设在第i个位置上作插入的概率为Pi,则平均移动数据元素的次数:设:Pi=1/ (n+1) ,即为等概率情况,则:这说明:在顺序表上做插入操作需移动表中一半的数据元素。显然时间复杂度为(n)。,躯重削弟愁陌怎饭恭垢鬼卡渠科秉替合戍赏意融藐境谍踢皂掀族企阻沛痊第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,23,删除运算 (1) 运算说明:线性表的删
17、除运算是指将表中第 i 个元素从线性表中去掉。,删除前:(a1, a2, . , ai-1, ai , ai+1 , . , an) 删除后:(a1, a2, . , ai-1, ai+1 , . , an ) 其中:1in,n是原来的表长。,撮郧垢辱冈邵节唐移寺蝉振捏捐楼厄傲速讳屯箔雀蚊龙顿窄哺泊靴悦荫话第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,24,(2)运算实现【算法 2-3】 顺序表的删除算法int Delete_SeqList(SeqList *L,int i)int j;if (iL-last+1) /*检查空表及删除位置的合法性*/ print
18、f (“不存在第i个元素“); return 0; /*不能删除,返回错误代码0*/for (j=i;jlast;j+)L-dataj-1=L-dataj; /*数据元素向前移动*/L-last-; /* last指向新的最后元素*/return 1; /*删除成功,返回成功代码1*/,厉睹唱惕语壶涝胳众嘲渣柄绽澡扭拘跨撤朵履雀亲渐划熔脉宣丈哟梨符革第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,25,(3)本算法中注意以下问题: 删除第i个元素,i的取值为 1in ,否则第i个元素不存在,因此,要检查删除位置的有效性。 当表空时不能做删除,因表空时 Llast的
19、值为-1,条件(iLlast+1)也包括了对表空的检查。 删除ai 之后,该数据已不存在,如果需要,先取出,再做删除。 修改表长。,徒矛薄瘪骚肉准乐泞炉体活搬位邑丈煤利筐私种毯箩历娜纶浇场班戳硅驻第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,26,(4) 删除算法的时间性能分析: 与插入运算相同,其时间主要消耗在了移动表中元素上,删除第i个元素时,其后面的元素 ai+1an 都要向上移动一个位置,共移动了 n-i 个元素,所以平均移动数据元素的次数:在等概率情况下,pi =1/ n,则:结论:顺序表上作删除运算时大约需要移动表中一半的元素。算法的时间复杂度为(n
20、)。,全瞅勋傀酪考霹邪禽迹炉陨客棒握洼帽侯堡活厉辩遍眩币余萍咽忿媚澄桂第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,27,按值查找,(1) 运算说明: 线性表中的按值查找是指在线性表中查找与给定值x相等的数据元素。,(2) 运算实现: 【算法2-4】 顺序表的按值查找算法 int Location_SeqList(SeqList *L,DataType x) int i;i=0;while (ilast /查找成功,返回数据元素在顺序表中的存储位置 ,襄忻塔涤就捎窗口伞业帅巢巾膳砌亡瞬志滞渐懒姬式剑后桐桑朵哨彬炬兹第2次课第2章线性表第2次课第2章线性表,201
21、9年5月24日,数据结构讲义,28,(3)按值查找算法的时间性能分析: 本算法的主要运算是给定值x与表中元素的比较。显然比较的次数与x在表中的位置有关,也与表长有关。当a1=x 时,比较一次成功。当an=x时,比较n次成功。等概率情况下,查找成功的平均比较次数为:,即:平均比较次数为(n+1)/2,时间性能为O(n)。,络胚蔓筛点七臼弱标调扑巳羞禁间份辫簇嫩溯椎潍阑菜茄似薪孩铂译柔杖第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,29,2.2.3 顺序表应用举例,例2-1 将顺序表(a1,a2,. ,an)重新排列为以a1为界的两部分:a1 前面的值均比 a1 小
22、,a1 后面的值都比a1大。 划分的方法有多种,下面介绍的划分算法其思路简单,性能较差。 基本思路:从第二个元素开始到最后一个元素,逐一向后扫描:当前数据元素 aI 比 a1 大时,表明它已经在 a1 的后面,不必改变它与 a1 之间的位置,继续比较下一个。当前结点若比 a1 小,说明它应该在 a1 的前面,此时将它上面的元素都依次向下移动一个位置,然后将它置入最上方。,块三摘喘蚀鉴尖喘寥求储需煌细心炔咽引嗡哀庙埋宅原贞允喝材竹怂捡郊第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,30,总的移动次数为 :即最坏情况下移动数据时间性能为()。,【算法2-5】 顺序表
23、划分算法 void part(SeqList *L) int i,j;datatype x,y; x=L-data0; /*将基准数据元素置入 x 中*/for (i=1;ilast;i+)if (L-dataidatai;for (j=i-1;j=0;j-) /*前面所有数据元素向后移动*/Ldataj+1=L-dataj;L-data0=y; /*将当前元素置入最前面位置*/ ,弯银法砂熟欣微膜觅脆掇晦肮柿镣诉掘晋缕巡棺里革舟楚胯染哗脸赠兰坛第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,31,例2-2 有顺序表A和B,其元素均按从小到大的升序排列,编写一个算
24、法将它们合并成一个顺序表C,要求C的元素也是从小到大的升序排列。 算法思路:依次扫描通过A和B的元素,比较当前的元素的值,将较小值的元素赋给C,如此直到一个线性表扫描完毕,然后将未完的那个顺序表中余下部分赋给C即可。C的容量要能够容纳A、B两个线性表相加的长度。,疮罪酥签硒霖故敛互菏橱饱欠母敏嚣叶胎舀找阑邹俞隐湾事被闯带皇崩若第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,32,【算法2-6】顺序表的合并 void merge(SeqList *A, SeqList *B, SeqList *C) int i,j,k;i=0; j=0; k=0;while ( i
25、last ,算法的时间性能是O(m+n),其中m是A的表长,n是B的表长。,挡镐邮封及翻埃究喉问悼巢菲浙吐渤漆祷免钵归话代座缄橙籽噪常畔锰蛀第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,33,例2-3比较两个线性表的大小。两个线性表的比较依据下列方法:设A、B是两个线性表,均用向量表示,表长分别为m和n。 A和B分别为 A 和 B 中除去最大共同前缀后的子表。例如A=(x,y,y,z,x,z), B=(x,y,y,z,y,x,x,z),两表最大共同前缀为 (x,y,y,z) 。则A=(x,z),B=(y,x,x,z),若A= B= 空表,则A=B;若A=空表且B
26、空表,或两者均不空且A首元素小于B首元素,则AB。,算法思路:首先找出A、B的最大共同前缀;然后求出A和B,之后在按比较规则进行比较,AB 函数返回1;A=B返回0;AB返回-1。,迪威唐酱村膘樟饿恳溺股宰狄征舷猫湿婆镇宦朗菇辜鸿闻惨羊抒钳页虑累第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,34,【算法2-7】两个顺序表的比较 int compare( int A , int B , int m, int n) int i=0, j, ms=0, ns=0; /* ms、ns为A、B的长度*/while (i0 | ms0 ,楚瓶莹艺吴访兵扯利窥狠福瘟匪墩脐欣搏
27、苦捶昭驶驹委站秤猖怂嫌朴悠来第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,35,2.1 线性表的逻辑结构2.1.1 线性表的定义2.1.2 线性表的基本运算 2.2 线性表的顺序存储2.2.1 顺序表2.2.2 顺序表上基本运算的实现2.2.3 顺序表应用举例,上节课回顾,溪龄珊绵材瘫源搽皆搬铂蔚标厨釉替荡拐钢超她乱恩兴海氓怯脆酱笋分涎第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,36,2.3 线性表的链式存储,2.3.1 单链表 2.3.2 单链表上基本运算的实现 2.3.3 循环链表 2.3.4 双向链表 2.3.5 静态链表
28、 2.3.6 链表应用举例,柄誊逼惨鼎翠症凹谦疽癌巍蚁捂易铣藻狂铱瑚翼龙处朴烹寻筷晋蜂斡煽手第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,37,2.3.1 单链表链表是通过一组任意的存储单元来存储线性表中的数据元素的,那么怎样表示出数据元素之间的线性关系呢?为建立起数据元素之间的线性关系,对每个数据元素ai,除了存放数据元素的自身的信息ai之外,还需要和ai一起存放其后继元素ai+1所在的存储单元的地址,这两部分信息组成一个“结点” 。,因此,n个元素的线性表可以通过每个结点的指针域拉成了一个“链”,称之为链表。,果殿详中汞诫焚斤罕肚聋轨琉须皑育摆不妒铸琳横尿凝
29、校蘸孩坊汤窥庄冒第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,38,结点定义如下: typedef struct node datatype data;struct node *next; LNode,*LinkList; 定义头指针变量: LinkList H;,迈趁褪纸土缺煞妆吃衅谩癸陋旺聚抒绳盔舀岳凉蚤渺然骆铝先翘屎虞烃斋第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,39,馅黎酗恃邪屏偏荡见害茧坠察旅乖摸喧显句瞥锅绊驼蜒拜操侠楚僧挞炕焊第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,40,(1)
30、 在链表的头部插入结点建立单链表,2.3.2 单链表上基本运算的实现 建立单链表,形稍捂剐驮粳倦砚短诅俏收抬负埃枷团次减抄程蠢汾枉勇吵绊丝穴砚您娩第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,41,【算法2-8】在表头插入结点,建立线性表的链式存储,linklist creat_ linklist() linklist L=null; LNode *s; int x; scanf(“%d”,酥炮阶奄喀心伪盼柱举皿竿与远罢喧书蛋倍肥兴镐拟杆鹊笔者雾睛驮授秋第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,42,1.创立单链表(在表头添加
31、),linklist creat_ linklist() linklist L=null; LNode *s; int x; scanf(“%d”,x=10,跪獭泵洛析悉氏植仆入哪褒熬宣幂铣夷幂执栏尉耍义凋凑植阻捡益板菩宫第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,43,1.创立单链表(在表头添加),linklist creat_ linklist() linklist L=null; LNode *s; int x; scanf(“%d”,x=20,L,簇坊熬嘎裁背烃椿儿淫寿甫槽戏膏烁痴曰篷谊桔弟维恶儒期杉卵楷钙狞的第2次课第2章线性表第2次课第2章线性表,
32、2019年5月24日,数据结构讲义,44,linklist creat_ linklist() linklist L=null; LNode *s; int x; scanf(“%d”,x=30,1.创立单链表(在表头添加),赎喘筹途厂钎米基馒任川入磁尤商好络铸埃侮追胖饲膘鸦肇具贺犊便站售第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,45,linklist creat_ linklist() linklist L=null; LNode *s; int x; scanf(“%d”,x=40,1.创立单链表(在表头添加),卸清染丈讹皿匹炽僵锹泥绊妹嗅拽燕契翁丫费拘
33、烈赌爆箍掘炭串搁垢母俩第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,46,(2) 在单链表的尾部插入结点建立单链表,等赔尹彦爷扮左识扦酿陇填哨拣凑接词而拽畸寐索柱买铱竹诱桐体哺数燃第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,47,linklist creat_ linklist() linklist L=null; Lnode *s,*r=null; int x; scanf(“%d”,【算法2-9】在表尾插入结点,建立线性表的链式存储,绊嫁慧遥渊注刮色结拎厅指馅功厨矮怖牧撑掩晾州绩渔船皂翔郡谣亦宽拯第2次课第2章线性表第2次课
34、第2章线性表,2019年5月24日,数据结构讲义,48,L,r,linklist creat_ linklist() linklist L=null; Lnode *s,*r=null; int x; scanf(“%d”,x=10,1.创立单链表(在表尾添加),掺瞩纸柄绎姑熬珍绦整俺技障茫暖管魁粕逮享滁蛀牛坝串煮引煮沁滞小棱第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,49,linklist creat_ linklist() linklist L=null; Lnode *s,*r=null; int x; scanf(“%d”,x=20,1.创立单链表(在
35、表尾添加),蓉郑托卿态窑沽西蛮耘妨稳扳烟本专乒菌猖羡欧舵带煞裕绑常墓性哎虱饲第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,50,linklist creat_ linklist() linklist L=null; Lnode *s,*r=null; int x; scanf(“%d”,x=30,1.创立单链表(在表尾添加),店命组彝导漾罚缉操脾棘仔惟笛卒秩歧瓤锣供兑挽氛搽滚抓沁场销铬寺屡第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,51,linklist creat_ linklist() linklist L=null; Ln
36、ode *s,*r=null; int x; scanf(“%d”,x=40,1.创立单链表(在表尾添加),饺渴例赡咎殃砍匠崩憨析氧授判铝理怖妈钝竟黑双芯荣娶伊衬扇俏响廉寓第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,52,linklist creat_ linklist() linklist L=null; Lnode *s,*r=null; int x; scanf(“%d”,x = -1,null,1.创立单链表(在表尾添加),堡苔妥逼帧询稿忱傍允搂歪胎丰阎鞋肃碴窃尧姿咖磐否刻醒刮琵激踞苛破第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数
37、据结构讲义,53,头结点问题的说明:头结点的加入完全是为了运算的方便,它的数据域无定义,指针域中存放的是第一个数据结点的地址,空表时为空。,贵葵嗣扛攫谁烤惊郊窟宅明岁啥财犬酌晨归寡逐询凑昭替镜祈汐克乎摊符第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,54,求表长,(1) 设L是带头结点的单链表 【算法2-10(a)】求带头结点的单链表表长 int Length_LinkList1 (LinkList L) LNode *p=L; /*p指向头结点*/int j=0;while (pnext) p=pnext; j+; /*p所指的是第 j 个结点*/return
38、 j; (2) 设L是不带头结点的单链表。 【算法2-10(b)】求单链表表长 int Length_LinkList2 (LinkList L) LNode *p=L; /*非空表情况下,p所指的是第一个结点*/int j=0;while (p) j+; p=pnext; return j; ,拐洱袱艺搀泰焕协循目逼前三贞昧享审灾利秽屿多粹薛僧藏沈燥筑糠揣蹭第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,55,查找操作,【算法2-11(a)】单链表中的按序号查找LNode *Get_LinkList(LinkList L, int i) /*在单链表L中查找第i
39、个元素结点,找到返回其指针,否则返回空*/LNode *p=L;int j=0;while (pnext!=NULL ,(1)按序号查找 Get_Linklist(L,i) 算法思路:从链表的第一个元素结点起,判断当前结点是否是第i个,若是,则返回该结点的指针,否则继续后一个,表结束为止。没有第个结点时返回空指针。,臭燎婪舔佯练辊宾厄德撼蛾吱侨千祈退堑谷汕莱坞玲颧仗撤浙留踢驴山昏第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,56,(2)按值查找即定位 Locate_LinkList(L,x)算法思路:从链表的第一个元素结点起,判断当前结点值是否等于x,若是,返回
40、该结点的指针,否则继续后一个,表结束为止。找不到时返回空指针。,【算法2-11(b)】单链表中的按值查找 LNode *Locate_LinkList( LinkList L, datatype x) /*在单链表L中查找值为x的结点,找到后返回其指针,否则返回空*/LNode *p=Lnext;while (p!=NULL 算法2-11(a)、(b)的时间复杂度均为O(n)。,郝巫纽祟副罪苏回碱铸帝汀狸祁并肮勃涟躇凌将博本钳搽莎费避设惰抿尾第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,57,插入操作,(1)后插结点:设p指向单链表中某结点,s指向待插入的值为x
41、的新结点,将*s插入到*p的后面。操作如下: s-next=p-next; p-next=s; 注意:两个指针的操作顺序不能交换。,朵胸惮门看桑戚转非喂狂灿搽爬相何襟跃谩傍挤锡摇除膝签承芯驶牧前倾第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,58,(2) 前插结点:设指向链表中某结点,指向待插入的值为x的新结点,将*s插入到*p的前面。与后插不同的是:首先要找到*p的前驱*q,然后再完成在*q之后插入*s,设单链表头指针为L,操作如下: q=L; while (q-next!=p)q=q-next; /*找*p的直接前驱*/ s-next=q-next; q-n
42、ext=s;,职肃踢缺匡之敞失淘奇窗筐迟蚀绵疆骚变角韩榔坦呸棺仁嗓锐顷晤谦叭算第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,59,(3) 插入运算 Insert_LinkList(L,i,x)算法思路: 找到第i-1个结点;若存在继续2,否则结束; 申请、填装新结点; 将新结点插入,结束。,骄资矩函坯句坡怪战周腊珐截辽叔适眼讯择基载况葫腮曼毅或捅吊甸讹庙第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,60,【算法2-12】单链表中的插入算法int Insert_LinkList( LinkList L, int i, datatyp
43、e x) /*在单链表L的第i个位置上插入值为x的元素*/LNode *p,*s;p=Get_LinkList(L, i-1); /*查找第i-1个结点*/if (p=NULL) printf(“参数i错误“); return 0; /*第i-1个不存在不能插入*/else s=(LNode *)malloc(sizeof(LNode); /*申请、填装结点*/sdata=x; snext=pnext; /*新结点插入在第i-1个结点的后面*/pnext=s;return 1; 算法2-12的时间复杂度为O(n)。,孽哨舰咳诚樟俗坝若娟彪彦茅拍熙凹焕茄墒醋岛伎诀纪纯峰及夸初捶芒食第2次课第2章
44、线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,61,删除操作,(1) 删除结点: 设p指向单链表中某结点,删除*p。要实现对结点*p的删除,首先要找到*p的前驱结点*q,然后完成指针的操作即可。指针的操作由下列语句实现:q-next=p-next;free(p); 显然找*p前驱的时间复杂性为O(n)。 若要删除*p的后继结点(假设存在),则可以直接完成:s=p-next;p-next=s-next;free(s); 该操作的时间复杂性为O(1) 。,妙蘑柄徒皇笺颅既鲸铅本抨赂障携场烃武兜胚丝伪捧驾谋往衍时讳澎案铆第2次课第2章线性表第2次课第2章线性表,2019年5月24日
45、,数据结构讲义,62,(2) 删除运算 Del_LinkList(L,i)算法思路:找到第i-1个结点;若存在继续2,否则结束;若存在第i个结点则继续3,否则结束;删除第i个结点,结束。,瑚峪模狮挨晚魏信治轴淫尔愚尝绦惜粗闪贬浪茧烁钓莉茬朽译挚硒彬蛰狙第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,63,【算法2-13】单链表中的删除算法 int Del_LinkList(LinkList L,int i) /*删除单链表L上的第i个数据结点 LinkList p,s;p=Get_LinkList(L,i-1); /*查找第i-1个结点*/if (p=NULL)
46、printf(“第i-1个结点不存在“);return -1; else if (pnext=NULL) printf(“第i个结点不存在“); return 0; else s=pnext; /*s指向第i个结点*/pnext=snext; /*从链表中删除*/free(s); /*释放*s */return 1;,慧年碱叔稿炸聊胶靡芦捉樱扳呢挚潍轧撵奉维辛俺蚊铝疾熏驯消屯馅绩熙第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,64,上节课回顾,单链表 单链表的基本运算 建立 求表长 查找 插入 删除 头结点,铁志跑岔贡桔绳窃柜缩班叠界勇灰着悟祷毫贬折箍擦绘肮秘恭
47、渐悬蛛外配第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,65,(2) R-data=P-data;,练习,对以下单链表分别执行下列各程序段,并画出结果示意图.,(1) L=P-next;,枫迷示吞搀漫诉捣芽幻谓映胆抡凡容札绎综珐汤谅庇驾荧学渤甚押雷驯呼第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,66,(3) R-data=P-next-data;,练习,喉斥辖共党噬乙顿项狮皆氢军颁黑河舱扯临屹逸振懦苯挫稀某陪蛊巾灰昭第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,67,(4) P-next-next
48、-next-data=P-data;,练习,斋炯六侗枝糕蠕动浙仁蟹绑芭驻亥剂倘陨宴影售碧纂囱贡幼韵算澄氦斋憎第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,68,(5) T=P;while(T!=NULL) T-data=(T-data)*2;T=T-next; ,练习,(6) T=P;while(T-next!=NULL) T-data=(T-data)*2;T=T-next; ,县雷球镇畜饶纱骸油揉掘翼萧馈邮掇揽售蜘股芥蛤苟手件廖那昨唾秀流致第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,69,(5) T=P;while(T!=NULL) T-data=(T-data)*2;T=T-next; ,练习,婉妆袖疾咽铣钢硬晃些舵链痛铰嘛赣太汰仰桃意臀滔靡迁翁碱巍狸沦菌烃第2次课第2章线性表第2次课第2章线性表,2019年5月24日,数据结构讲义,70,