1、3)有限性:线性表中元素的个数n称为线性表的长度,n=0时称为空表4)有序性:ai是线性表的第i个元素,称i为数据元素ai的序号,每一个元素在线性表中的位置,仅取决于它的序号;二二 线性表根据其存储结构不同可分为:线性表根据其存储结构不同可分为:链式存储结构的链表顺序存储结构的顺序表结束第 5 页一一 线性链表的概念线性链表的概念1线性链表1、线性链表线性链表a a4 4a a3 3a a1 1a a2 2 0101010241014101010121014101610181020102210241026用一组任意的存储单元存储线性表中的数据元素,对每个数据元素除了保存自身信息外,还保存了直接
2、后继元素的存储位置。用线性链表存储线性表时,数据元素之间的关系 是通过保存直接后继元素的存储位置来表示的结束第 6 页线性链表图示ai-1aia2a1ai+1nan用线性链表存储线性表时,数据元素之间的关系 是通过保存直接后继元素的存储位置来表示的2线性链表图示一般来说,我们并不需要写出直接后继的实际地址,为直观起见,通常用如下所示的图表示链表,其中,箭头表示相应单元中保存的是它所指向结点的存储地址。headhead是头指针是头指针headhead结束第 7 页结点结点:数据元素及直接后继的存储位置(地址)组成一个数据元素的存储结构,称为一个结点;结点的数据域结点的数据域:结点中用于保存数据元
3、素的部分;结点的指针域结点的指针域:结点中用于保存数据元素直接后继存储地址的部分;3 线性链表有关术语线性链表有关术语存储数据元素存储数据元素存储后继结点存储后继结点 存储地址存储地址结点结点数据域数据域指针域指针域结束第 8 页头指针:头指针:用于存放线性链表中第一个结点的存储地址存储地址;空指针:不指向任何结点,线性链表最后一个结点的指针通常是空指针,空指针一般用NULL表示;头结点:线性链表的第一元素结点前面的一个附加结点,称为头结点;带头结点的线性链表带头结点的线性链表:第一元素结点前面增加一个附加结点的线性链表称为带头结点的线性链表;带头结点的线性链表图示headhead是头指是头指
4、针针ai-1aia2a1ai+1nan 头结点头结点 空指针空指针headhead结束第 9 页线性链表的每个结点中只有一个指针域故也称为单链表单链表ai-1aia2a1ai+1nanheadhead是头指针是头指针headhead注:从以往二级考试来看都是用没有附加头结点的链表,如图所示结束第 10 页结点变量图示structnodeintx;structnode*next;;node:结构体类型名;node类型结构变量有两个域:x:用于存放线性表的数据元素,next:用于存放元素直接后继结点的地址;该类型结构变量用于表示线性链表中的一个结点;h和head:指向结构体结点的指针变量,用于存放
5、node类型结构变量的地址;数据域数据域指针域指针域 x next node类型结构变量h h结构体结点指针变量h4线性链表的结点类型定义及指向结点的指针类型定义structnode*h;或structnode*head;结构体指针变量定义结构体类型定义结束第 11 页常用的引用格式常用的引用格式(一般格式一般格式):指针变量名指针变量名-结构体成员名结构体成员名如:如:h-x=10;h=h-next;注意:在引用过程中,数据类型还是成员的数据类型。h-x为成员x的数据类型(即整形)5怎样利用结构体指针变量来引用结构体成员structnode*h;不常用引用格式:(*指针变量名)指针变量名).
6、结构体成员名结构体成员名如:(*h).x=10;*h=(*h).next;结束第 12 页设head是指向链表第一个结点的指针变量,head用来保存线性链表中第一个结点的地址。ai-1aia2a1ai+1nanheadheadHead指向的链表二线性链表基本操作的算法假设线性表用不不带头结点的线性链表head的存储。下面讨论在这种存储方式下,线性表各种基本操作的算法。当线性表用线性链表存储时,对线性表各种基本操作实际上就是对存储在内存中的线性链表进行操作。结束第 13 页如何在线性链表head上实现线性表的基本操作?如何建空表?如何插入?删除?结束第 14 页1取元素操作(从链表中找到与输入的
7、值m相等的元素)功能:1、将线性链表中第i个元素赋值给e2、从链表中找到与输入的值m相等的元素,并将其指针返回取元素操作主要步骤:1)查找链表的第i个元素结点;2)将第i个元素结点中的数据元素赋值给e;(或将其指针返回;)取元素操作图示ai-1aia2a1ai+1nanheadheadp1p1p p注:p、p1为工作指针结束第 15 页2插入操作功能:在线性链表head的第i个元素结点之前插入一个新元素结点;插入操作图示:插入前插入后ai-1aia2a1ai+1nanheadheadai-1aia2a1ai+1naneheadhead结束第 16 页插入操作主要步骤:1)查找链表L的第i-1个
8、元素结点;2)为新元素建立结点;3)修改第i-1个元素结点的指针域和新元素结点指针域,从而完成插入;结束第 17 页3删除操作功能:在线性链表L中删除第i个元素,并且用e返回其值删除操作图示:删除前删除后ai-1aia2a1ai+1nanheadheadai-1aia2a1ai+1nanheadhead结束第 18 页删除操作主要步骤:1)查找链表的第i-1个元素结点;2)修改第i-1个元素结点指针域,使其指向第i+1个结点,从而删除第i个元素结点;3)将第i个元素结点中的数据元素赋值给e;4)回收被删除结点空间;用free(指针变量)函数释放删除结点的空间结束第 19 页4线性链表归并操作图
9、示131n542n6papb归并31n6papcpb524结束第 20 页以前考过的线性链表的题目以前考过的线性链表的题目lP10 13题(即题(即2000年秋的填空题中的年秋的填空题中的13题)题)此题是链表归并问题:此题是链表归并问题:首先要搞清楚每个指针的用途。如如pt指针变量就是用来指向建立的新结点;指针变量就是用来指向建立的新结点;pc为新链表的头结点;为新链表的头结点;pcr为工作结点,也是新链表的尾结点指针,即为工作结点,也是新链表的尾结点指针,即它始终指针新链表的最后一个结点。它始终指针新链表的最后一个结点。结束第 21 页P60 13题(即题(即2000年秋的填空题中的年秋的
10、填空题中的13题)题)PNODE *padd(PNODE *pa,PNODE*pb)PNODE*pcr,*pt,*pc;pc=NULL;while(23)if(pa-y=pb-y)pt=(24)malloc(sizeof(PNODE);pt-x=pa-x+pb-x;pt-y=pa-y;pt-next=NULL;if(pc=NULL)pc=pcr=pt;else pcr-next=pt;(25);pa=pa-next;pb=pb-next;else if(26)pb=pb-next;else pa=pa-next;Return pc;本空显然是控制结束的,只有当pa、pb两个链表中都没有元素时才
11、会结束分配的空间类型判断papb中当前元素y成员的值谁大将新增的结点连到工作指针pcr上结束第 22 页P10 13题(答案)题(答案)PNODE *padd(PNODE *pa,PNODE*pb)PNODE*pcr,*pt,*pc;pa&pbPNODE*pa-ypb-ypcr=pt结束第 23 页P21 14题(即题(即2001年春的填空题中的年春的填空题中的14题)题)PNODE *padd(PNODE *pa)PNODE*p1,*p2,*p;p1=p2=pa;while(p1)if(p1-x%2=0&(27)p=p1;p1=p1-next;(28)=p1;P-next=pa;(29)el
12、se p2=p1;Main()PNODE a10=1,2,3,4,5,6,7,8,9,10,*ha=a,*p;int i;for(i=0;i”,p-x);p=p-next;链表结尾的指针(NULL)如果p1指向的结点就是第一个结点,则不用移本行是从链表中删除结点将p指向的结点插到链表的头部没找着偶数值结点时,指针向后移,P2一直在P1的前一个结点结束第 24 页P21 14题(答案)题(答案)PNODE *padd(PNODE *pa)PNODE*p1,*p2,*p;NULLp1!=pap2-next=p1pa=p结束第 25 页P31 14题(即题(即2001年秋的填空题中的年秋的填空题中的
13、14题)题)Struct node *deladd(struct node *h,int value)struct node *p1,*p2;int flage=0;p1=p2=h;while(p1&flage=0)if(p1-x=value)flage=1;if(p1=h)h=(27);free(p1);else p2-next=(28);else p2=p1;p1=(29);If(flage=0)p1=(struct node*)malloc(sizeof(struct node);p1-x=value;p1-next=0;if(h=0)h=p1;else (30);链表结束或找到结点不执行循环Flage是一个标志变量用来标志是否找到结点如果找到符合每件的结点,就删除结点如果没找到适合每件的结点,则指针后移如果没找到
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1