数据结构课件代码第2章线性表2713.ppt
《数据结构课件代码第2章线性表2713.ppt》由会员分享,可在线阅读,更多相关《数据结构课件代码第2章线性表2713.ppt(71页珍藏版)》请在三一办公上搜索。
1、第2章 线性表(二),张成文北京邮电大学计算机学院,桔隙浸钎闯鳖辉迪省藕诅嘛灭鲤馒睛挑峡遁央拿烤尖柔胸瓣址皆耳托晴遣数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,主要内容,2.7 线性表的链式存储结构表示2.8 单链表2.9 循环链表2.10 双向链表2.11各种链式存储结构的比较2.12顺序表与链表的比较 2.13小结,胸激翟各稼宜贬果幻摧碉婪圾壹辩鸡二含辉缘眯茬京孕折河变厅定蔚索又数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,线性表的链式存储结构表示,结点(Node):既要存储线性表的每个数据元素值,又
2、要存储指示其后继结点的地址(或位置)信息,以表示结点间的逻辑关系。这两部分信息组成的存储映象叫做结点(Node)。,茧护阔舒麦递相也懊救瞄八患执镶胖任磷畜愁昭朝僻肺刚缚仆秤物维锻砧数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,1 线性表的链式存储结构表示,让每个存储结点都包含两部分:数据域和指针域,数据域:存储元素的值,指针域:存储直接后继或直接前驱元素的存储地址,设计思想:牺牲空间效率换取时间效率,栗惨羹洋哇驱公膳卿节毙湿劣防酒畸贰诬显犬拼腑助也溪老穆啮国翅涎目数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3
3、,其结点在存储器中的位置是随意的,即逻辑上相邻的数据元素在物理上不一定相邻。,如何实现?,通过指针来实现!,链式存储结构特点,a1,a2,a3,裔傀综厘嚎懈状喧卵镁蚌晒背缮橱寅垒旺捷括旅椎炕杭龄蒂邓蛮杯蛛包衫数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,与链式存储有关的术语,1)结点:数据元素的存储映像。由数据域和指针域两部分组成;2)链表:n 个结点由指针链组成一个链表。它是线性表的链式存储映像,称为线性表的链式存储结构。3)单链表、双向链表、循环链表:结点只有一个指针域的链表,称为单链表或线性链表;有两个指针域(直接前驱和直接后继)的链表,称为双
4、向链表;首尾相接的链表称为循环链表。,循环链表示意图:,head,买蚜抿蕊城演郧诣绽茁细邀峨源塑蚕娃窝瘤姓淳腻蕊避撼厌赘频濒丰智邓数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,4)头指针、头结点和首元结点的区别,示意图如下:,头指针,头结点,首元结点,头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针;头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息,它不计入表长度。首元结点是指链表中存储线性表第一个数据元素a1的结点。,下面举例说明。,阶敖菇凯阂曼蓑哟刺椎玫爱栗悬迭释强玄掺滚阀堡蔼仰钟扳裸含企恿们凹数据结构课件
5、、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,头指针L,头指针L,头结点,首元结点,首元结点,空表:L=NULL,L,1264,1264,4016,4016,头结点的作用:插入和删除第一个数据元素时不必对头指针进行特殊处理。,与链式存储有关的术语,砷百郝脑帖椰寸鸦利航某塑辜玖撼吊胞叫轰诺真结罢五诺负川渴才钧鞍貉数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,一个线性表的逻辑结构为:(ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG),其存储结构用单链表表示如下,请问其头指针的值是多少?,例1:,答:
6、头指针是指向链表中第一个结点的指针,因此关键是要寻找第一个结点的地址。,31,称:头指针H的值是31,阎秽酞痢迹赛更漫苍磅个秆咳捞球报年躺徐干丽渴扁悟装笨锨恩疥唤他郎数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,例2:线性表具有两种存储方式,即顺序方式和链接方式。现有一个具有五个元素的线性表L=23,17,47,05,31,若它以链接方式存储在下列100119号地址空间中,每个结点由数据(占2个字节)和指针(占2个字节)组成,如下图所示。,其中指针X,Y,Z的值分别为多少?该线性表的首结点起始地址为多少?末结点的起始地址为多少?,100,119,答:
7、X=Y=Z=,首址=末址=.,104,108,116,112,116,NULL/0,100,108,112,仔律海饭阶镁抨冕试氯秀吉汝常啮褪铭孪箍屈诅按择空毁僧宁然孤形寨腿数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,单链表,单链表:链表中的每个结点只有一个指针域,我们将这种链表称为单链表。单链表包括两个域:数据域用来存储结点的值;指针域用来存储数据元素的直接后继的地址(或位置)。,荡坦踞拢邢色啥嘉后釉赂斌鸽西司银菠涨伴湾杆津燃厌找咨炙卖讹敝杂叫数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,从链表的整体结构
8、上看,链表可以是空链,也可以由一个或多个结点组成。每条链有一个入口的头结点,该结点仅指示链中第一个结点的地址。如是空链,则可表示为“0”或“”,它类似于一个常量。每条链的最后一个结点的链指针为“0”,也可用“”作为链的结束标志。下图给出了链表的示意形式。图(a)中有一个头结点和具有A、B、C、D数据元素的链,图(b)所示为线性链表的一般表示,结点与结点之间用箭头链接。,单链表,隐棵掺洞俯采饵到蝉柏贮绑册辣遵狸茬丁掏咬宽媚暑仲唾毁咳紧紫济慢附数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,链表图示(a)链表的图示;(b)链表的一般表示,巢洞木捣矣蕊愚沮吐
9、饲汾圾芳谆郭狼帝贿垛懦围枝蠕豹类冒靖老远岸斤傍数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,以线性表中第一个数据元素 的存储地址作为线性表的地址,称作线性表的头指针。,头结点,头指针,头指针,有时为了操作方便,在第一个结点之前虚加一个“头结点”,以指向头结点的指针为链表的头指针。,空指针,线性表为空表时,头结点的指针域为空,隐辞晤剑惰乌喇烹逛斌灾惩欧洞永歌铣戮谴正湖却骆担历候蹄换暂已虱达数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,讨论:链表的数据元素有两个域,不再是简单数据类型,编程时该如何表示?,因每个
10、结点至少有两个分量,且数据类型通常不一致,所以要采用结构数据类型。,答:,以26个字母的链表为例,每个结点都有两个分量:,假设每个结点用变量node表示,结点指针用p表示,其中两个分量分别用data和*next表示,该如何书写?,方式1:直接表示为 node.dataa;node.next=q方式2:p指向结点首地址,然后 p-data=a;p-next=q;方式3:p指向结点首地址,然后(*p).data=a;(*p).nextq,薛凶烬吕窒沥酞疯恳枉嘿招奖后默鳖弊抉表咕稻发浦骗鼎城理抖淳汞椭扬数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,单链表的
11、存储结构描述,typedef struct Node/结点类型定义 ElemType data;struct Node*next;Node,*LinkList;/LinkList为结构指针类型,掐写说福夕肾蒸阻抄销怖波员励角棘雨赏曾匠头厕趁舰骚烙奖味真谎谢四数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,设p为指向链表的第i个元素的指针,则第i个元素的数据域写为,指针域写为。,练习:,p-data,ai的值,p-next,ai+1的地址,链表不具备的特点是。A、可随机访问任何一个元素 B、插入、删除操作不需要移动元素 C、无需事先估计存储空间大小 D、
12、所需存储空间与线性表长度成正比,沦撰屠套蝗销厉臻乾趟避蓝镰弯迁侵寐弃撬里叫逮背谐咎瀑夷蓄疯素渠壮数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,静态链表 用数组模拟可利用空间表,0 1 2 3 4 5 6 7 8 9 3 8 1-1 6 cur(游标)a2 a1 a4 a3 data,#define MAXSIZE 10/链表的最大长度typedef struct ElemType data;int cur;componet,SLinkListMAXSIZE;,第1个元素的下标:SLinkList0.cur,宣串晾扳沥娟尧冗袍啸煮矽企馏街搁骂姚纶即敢雪
13、腾铅毋聊镜霹钒窃援抉数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,带头结点的单链表上的基本运算,1 建立单链表2 单链表查找3 单链表插入4 单链表删除第i个结点,托卑挂影县革呵罢雅缓祖镶叭疟深刻赔宰奖犀陡顽著钟湾巳灼葵汤殿奏披数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,建立单链表,1)头插法建表(逆序),操作步骤:,建立一个“空表”;,输入数据元素an,建立结点并插入;,输入数据元素an-1,建立结点并插入;,an,an-1,依次类推,直至输入a1为止。,风恢蒙高劝虫保桐漫瘤迭芦贱摇胞堤剃频善苯蘑蓄捷这
14、圈峻黑卸徊河拼赊数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,头插法建表算法,Linklist CreateFromHead()LinkList L;Node*s;int flag=1;/标志flag初值为1 L=(Linklist)malloc(sizeof(Node);/分配头结点 L-next=NULL;while(flag)/输入“$”时,flag置0,建表结束 c=getchar();if(c!=$)/为新结点分配存储空间 s=(Node*)malloc(sizeof(Node);s-data=c;s-next=L-next;L-next=
15、s;/链接 else flag=0;return L;,避案卵楼汁凯遁限悲利黔帆掷账敌徒刊镶舌俯染碑羔草抠娜朽馋脉划恰允数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,2)尾插法建表:设尾指针r建立一个“空表”,r 指向头结点;输入数据元素C1,建立结点并链接,r指向该结点;输入数据元素C2,建立结点并链接,r指向该结点;输入数据元素Cn,建立结点并链接,r指向该结点;,咯微药甭站净偿院患灿捉拟瞅逛鲸呢蕾同栅暇漂梦缄亚埃壹帜篓铅札丫醉数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,尾插法建表算法,Linklis
16、t CreateFromTail()/新结点加到链表末尾 LinkList L;Node*r,*s;int flag=1;/flag初值 L=(Node*)malloc(sizeof(Node);/分配头结点 L-next=NULL;r=L;/r始终指向链表的表尾 while(flag)/输入“$”时flag为0,建表结束 c=getchar();if(c!=$)s=(Node*)malloc(sizeof(Node);s-data=c;r-next=s;r=s/链接 else flag=0;r-next=NULL;return L;,需游缄椒面诛癣烤憋塘傅桑颠朋挫鹿钝嗽粤吹僳系磊怪授铡擒勺雕
17、杰禾滇数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,单链表查找,1)按序号查找 算法描述:设带头结点的单链表的长度为n,要查找表中第i个结点,则需要从单链表的头指针L出发,从头结点(L-next)开始顺着链域扫描,用指针p指向当前扫描到的结点,初值指向头结点(p=L),用j做记数器,累计当前扫描过的结点数(初值为0),当j=i 时,指针p所指的结点就是要找的第i个结点。算法实现,算法演示。,烩实斤泪拖守辽纫龙感宜视肢昆巴侄锚珍闸癸腹华枝碘红讣痕杨杯旱缆使数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,线性表的
18、操作 Get(L,i)在单链表中i=3时,Get的实现过程:,j,1,2,3,P-data=30,派忱皿侨堂毁分砌皱洗亨煮韩祟危鲤洽圃猪该戈囚级商屏横铺醉碌才疯梳数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,因此,查找第 i 个数据元素的基本操作为:移动指针,比较 j 和 i。,令指针 p 始终指向线性表中第 j 个数据元素。,单链表是一种顺序存取的结构,为找第 i 个数据元素,必须先找到第 i-1个数据元素。,账鞍注债纳姿畅扭露喝捂滑颁宠雾诽吊镇肝略垃董卵蚊盛整姆沾鄂祷詹裤数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表
19、2-71-3,按序号查找算法实现,/找第i个结点,找到返回指向它的指针;否则返回空Node*Get(LinkList L,int i)Node*p;p=L;j=0;/从头结点开始扫描 while(p-next!=NULL)&(jnext;j+;/扫描下一结点 if(i=j)return p;/找到了第i个结点 else return NULL;/找不到,i0或in,算法时间复杂度为:,O(Length(*L),阂匠掂腰毋拜飘尚珍虫拥瞩皱司讲鹊吞愈蹲庚氟胳富桑管酱侈肖撬谷紫勺数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,2)按值查找算法描述:按值查找是
20、指在单链表中查找是否有结点值等于e的结点,若有的话,则返回首次找到的其值为e的结点的存储位置,否则返回NULL。查找过程从单链表的头指针指向的头结点出发,顺着链逐个将结点的值和给定值e作比较。算法实现,算法演示。,畴元衡矫墨霹爱枢赤蹭仪胆署俱眷斑价倘坑卧稽听打吧显骄瞒锑曙寥捷般数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,按值查找算法实现,/查找其结点值等于key的结点,若找到则返回该结点的位置p,否则返回NULL*/Node*Locate(LinkList L,ElemType key)Node*p;p=L-next;/从表中第一个结点比较 whi
21、le(p!=NULL)if(p-data!=key)p=p-next;else break;/找到结点key,退出循环 return p;,算法时间复杂度为:,O(Length(*L),大膳粮加匝馏摊株样侦箩钙婴斡沉篙筑叶管仔闺岿灭中疫悄痰谷识闷描林数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,3.单链表插入操作 InsList(L,i,e)的实现:,有序对 改变为 和,可见,插入结点需要修改第 i-1 个结点的指针和新结点的指针。,在单链表第i个结点之前插入结点的步骤为:,1)找到单链表的第i-1个结点并由指针pre指示。,2)然后申请一个新结点并
22、由指针s指示。,3)将pre指示结点的指针值赋给s指示结点的指针域。(将第i个结点链接到新结点上),4)然后修改pre指示结点的指针域,使它等于s。(新结点链接到第i-1个结点上),单链表插入,魂浙荤懦制凄缓驭哺松勿真嗡脾蒂蔽筋抒愿公灯辆收灯忌挤常惺页诛芬猜数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,int InsList(LinkList L,int i,ElemType e)/在单链表L第i个结点前插入值为e的新结点 Node*pre,*s;pre=L;int k=0;/先找到第i-1个结点的存储位置,让Pre指向它 while(pre!=NU
23、LL,算法时间复杂度为:,O(Length(*L),晶教却淀罢悸磊渤及算浑谰按唁计召涧仲灌汐恍秆烫备寸模牙痴盛缕救嫩数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,s=(Node*)malloc(sizeof(Node);/申请新结点 s-data=e;/将e赋给s的数据域 s-next=pre-next;pre-next=s;/链接,赦傲释州孔篱囚怯焚仍吁巍啄盏改悟渍樱箩禽像矢越祖丽歌悬玩政礁喷窿数据结构课件、代码第2章 线性表2-71-3数据结构课件、代码第2章 线性表2-71-3,如下图所示的是链表插入前、后的逻辑状态。从图中可以看出,要插入一个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课件 代码 线性 2713

链接地址:https://www.31ppt.com/p-4808023.html