《数据结构课件、代码》第2章线性表.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《《数据结构课件、代码》第2章线性表.ppt》由会员分享,可在线阅读,更多相关《《数据结构课件、代码》第2章线性表.ppt(71页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第2章 线性表(二)张成文张成文北京邮电大学计算机学院北京邮电大学计算机学院主要内容2.7 2.7 线性表的链式存储结构表示线性表的链式存储结构表示2.8 2.8 单链表单链表2.9 2.9 循环链表循环链表2.10 2.10 双向链表双向链表2.112.11各种链式存储结构的比较各种链式存储结构的比较2.122.12顺序表与链表的比较顺序表与链表的比较 2.132.13小结小结线性表的链式存储结构表示结点结点(Node):既要存储线性表的每个既要存储线性表的每个数据元素值数据元素值,又要存储指示其后继结点的又要存储指示其后继结点的地址地址(或位置或位置)信息信息,以以表示结点间的逻辑关系。这
2、两部分信息组成的存表示结点间的逻辑关系。这两部分信息组成的存储映象叫做结点储映象叫做结点(Node)。1 线性表的链式存储结构表示让每个存储结点都包含两部分:让每个存储结点都包含两部分:数据域数据域和和指针域指针域指针指针数据数据指针指针数据数据指针指针或或样式:样式:数据域:数据域:存储存储元素的值元素的值指针域:指针域:存储直接后继或存储直接后继或直接前驱元素的存储地址直接前驱元素的存储地址设计思想:牺牲空间效率换取时间效率设计思想:牺牲空间效率换取时间效率其其结结点点在在存存储储器器中中的的位位置置是是随随意意的的,即逻逻辑辑上相邻的数据元素在物理上不一定相邻。上相邻的数据元素在物理上不
3、一定相邻。如何实现?通过指针指针来实现!链式存储结构特点La1a2a3与链式存储有关的术语与链式存储有关的术语1)结点:)结点:数据元素的存储映像。由数据域和指针域数据元素的存储映像。由数据域和指针域两部分两部分组成;组成;2)链表:)链表:n n 个结点由个结点由指针链指针链组成一个链表。它是线性表的链式组成一个链表。它是线性表的链式存储映像存储映像,称为线性表的链式存储结构称为线性表的链式存储结构。3)单链表、双向链表、循环链表)单链表、双向链表、循环链表:结点只有一个指针域的链表,称为结点只有一个指针域的链表,称为单链表单链表或或线性链表线性链表;有两个指针域(直接前驱和直接后继)的链表
4、,称为有两个指针域(直接前驱和直接后继)的链表,称为双双向向链链表表;首尾相接的链表称为首尾相接的链表称为循环链表循环链表。a1heada2an循环链表示意图:循环链表示意图:headhead4)头指针、头结点和首元结点的区别)头指针、头结点和首元结点的区别 示意图如下:示意图如下:头指针头指针头结点头结点首元结点首元结点a1heada2infoan头指针头指针是指向链表中第一个结点(或为头结点或为首元结是指向链表中第一个结点(或为头结点或为首元结点)的指针;点)的指针;头结点头结点是在链表的首元结点之前是在链表的首元结点之前附设附设的一个结点;数据域的一个结点;数据域内只放空表标志和表长等信
5、息,它不计入表长度。内只放空表标志和表长等信息,它不计入表长度。首元结点首元结点是指链表中存储线性表第一个数据元素是指链表中存储线性表第一个数据元素a a1 1的结点。的结点。下面举例说明。下面举例说明。头指针L头指针L头结点首元结点首元结点空表:L=NULLL 1264126440164016头结点的作用头结点的作用:插入和删除第一个数据元素时不必对头指针进行特殊处理。与链式存储有关的术语与链式存储有关的术语一个线性表的逻辑结构为:一个线性表的逻辑结构为:(ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANGZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WA
6、NG),其存),其存储结构用储结构用单链表单链表表示如下,表示如下,请问其请问其头指针头指针的的值值是多少是多少?存储地址存储地址数据域数据域指针域指针域1LI437QIAN1313SUN119WANGNULL25WU3731ZHAO737ZHENG1943ZHOU25例例1:答:答:头指针头指针是指向链是指向链表中表中第一个第一个结点的指结点的指针,因此关键是要寻针,因此关键是要寻找找第一个结点第一个结点的的地址地址。7ZHAOH31称:头指针称:头指针H的值是的值是31例例例例2 2 2 2:线线性性表表具具有有两两种种存存储储方方式式,即即顺顺序序方方式式和和链链接接方方式式。现现有一个
7、具有五个元素的线性表有一个具有五个元素的线性表L=23L=23,1717,4747,0505,3131,若若它它以以链链接接方方式式存存储储在在下下列列100100119119号号地地址址空空间间中中,每每个个结结点点由数据(占由数据(占2 2个字节个字节)和指针(占)和指针(占2 2个字节个字节)组成,如下图所示。)组成,如下图所示。其其中中指指针针X X,Y Y,Z Z的的值值分分别别为为多多少少?该该线线性性表表的的首首结结点点起起始始地址地址为多少?为多少?末结点的起始地址末结点的起始地址为多少?为多少?Z Z47474747Y Y3131V V23232323X X1717U U05
8、05100100100100119119119119答:答:X=X=Y=Y=Z=Z=,首址首址=末址末址=.104104104104108108108108116116116116112112112112116116116116NULL/0NULL/0NULL/0NULL/0100100100100108108108108112112112112单链表 单链表单链表:链表中的每个结点只有一个指针域链表中的每个结点只有一个指针域,我们将这种链表称为单链表。我们将这种链表称为单链表。单链表包括单链表包括两个域两个域:数据域数据域用来存储结点的值用来存储结点的值;指针域指针域用来存储数据元素的直接后
9、继的地用来存储数据元素的直接后继的地址址(或位置或位置)。从链表的整体结构上看,链表可以是空链,也可以由一个或多个结点组成。每条链有一个入口的头结点,该结点仅指示链中第一个结点的地址。如是空链,则可表示为“0”或“”,它类似于一个常量。每条链的最后一个结点的链指针为“0”,也可用“”作为链的结束标志。下图给出了链表的示意形式。图(a)中有一个头结点和具有A、B、C、D数据元素的链,图(b)所示为线性链表的一般表示,结点与结点之间用箭头链接。单链表 链表图示(a)链表的图示;(b)链表的一般表示 以线性表中第一个数据元素 的存储地址作为线性表的地址,称作线性表的头指针。头结点头结点 a1 a2
10、.an 头指针头指针 有时为了操作方便,在第一个结点之前虚加一个“头结点”,以指向头结点的指针为链表的头指针。空指针线性表为空表时,头结点的指针域为空 讨论:链表的数据元素有两个域,不再是简单数据类链表的数据元素有两个域,不再是简单数据类型,编程时该如何表示?型,编程时该如何表示?因每个结点至少有两个分量,且数据类型通常不一致,所因每个结点至少有两个分量,且数据类型通常不一致,所以要采用结构数据类型。以要采用结构数据类型。答:答:以以2626个字母的链表为例,每个结点都有两个分量:个字母的链表为例,每个结点都有两个分量:字符型字符型指针型指针型假设每个结点用变量假设每个结点用变量nodenod
11、enodenode表示,结点表示,结点指针用指针用p p p p表示,其中两个分量分别用表示,其中两个分量分别用datadata和和*next*next表示,该如何书写?表示,该如何书写?p*next*nextdatadatanodenode方式方式1:直接表示为直接表示为 node.dataaa;node.next=q q方式方式2:p指向结点首地址,然后指向结点首地址,然后 p-data=aa;p-next=q q;方式方式3:p指向结点首地址,然后指向结点首地址,然后(*p).data=aa;(*p).nextq qaabq qp p单链表的存储结构描述typedef struct No
12、de typedef struct Node /结点类型定义结点类型定义 ElemType data ElemType data;struct Node *next struct Node *next;Node,*LinkListNode,*LinkList;/LinkList/LinkList为结构指针类型为结构指针类型设设p p为指向链表的第为指向链表的第i i个元素的指针个元素的指针,则第则第i i个元素的个元素的数据域写为数据域写为 ,指针域写为,指针域写为 。练习:练习:p-dataai的值的值p-nextai+1的地址的地址链表不具备的特点是链表不具备的特点是 。A A、可随机访问
13、任何一个元素、可随机访问任何一个元素 B B、插入、删除操作不需要移动元素、插入、删除操作不需要移动元素 C C、无需事先估计存储空间大小、无需事先估计存储空间大小 D D、所需存储空间与线性表长度成正比、所需存储空间与线性表长度成正比 静态链表静态链表 用数组模拟可利用空间表 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 1个元素的下标:个元素的
14、下标:SLinkList0.cur SLinkList0.cur带头结点的单链表上的基本运算1 1 建立单链表建立单链表2 2 单链表查找单链表查找3 3 单链表插入单链表插入4 4 单链表删除第单链表删除第i i个结点个结点建立单链表1)头插法建表(逆序)头插法建表(逆序)操作步骤:操作步骤:建立一个建立一个“空表空表”;输入数据元素输入数据元素an,建立结点并插入;建立结点并插入;输入数据元素输入数据元素an-1,建立结点并插入;建立结点并插入;ananan-1依次类推,直至输入依次类推,直至输入a1为止。为止。ss头插法建表算法Linklist CreateFromHead()Linkl
15、ist CreateFromHead()LinkList L;Node*s;int flag=1;LinkList L;Node*s;int flag=1;/标志标志flagflag初值为初值为1 1 L=(Linklist)malloc(sizeof(Node);L=(Linklist)malloc(sizeof(Node);/分配头结点分配头结点 L-next=NULL;L-next=NULL;while(flag)while(flag)/输入输入“$”“$”时时,flag,flag置置0,0,建表结建表结束束 c=getchar();c=getchar();if(c!=$)if(c!=$
16、)/为新结点分配存储空间为新结点分配存储空间 s=(Node*)malloc(sizeof(Node);s-data=c;s=(Node*)malloc(sizeof(Node);s-data=c;s-next=L-next;L-next=s;s-next=L-next;L-next=s;/链接链接 else flag=0;else flag=0;return L return L;r c c1 1 s sLc cn n s srr 2)尾插法建表:设尾指针r建立一个建立一个“空表空表”,r 指向头结点指向头结点;输入数据元素输入数据元素C1,建立结点并链接建立结点并链接,r指向该结点;指向该
17、结点;输入数据元素输入数据元素C2,建立结点并建立结点并链接链接,r指向该结点;指向该结点;输入数据元素输入数据元素Cn,建立结点并建立结点并链接链接,r指向该结点;指向该结点;c c2 2 s sr 尾插法建表算法Linklist CreateFromTail()Linklist CreateFromTail()/新结点加到链表末尾新结点加到链表末尾 LinkList L;Node*r,*s;int flag=1;LinkList L;Node*r,*s;int flag=1;/flag/flag初值初值 L=(Node*)malloc(sizeof(Node);L=(Node*)mallo
18、c(sizeof(Node);/分配头结点分配头结点 L-next=NULL;r=L;L-next=NULL;r=L;/r/r始终指向链表的表尾始终指向链表的表尾 while(flag)while(flag)/输入输入“$”“$”时时flagflag为为0 0,建表结,建表结束束 c=getchar();c=getchar();if(c!=$)if(c!=$)s=(Node*)malloc(sizeof(Node);s-data=c;s=(Node*)malloc(sizeof(Node);s-data=c;r-next=s;r=sr-next=s;r=s /链接链接 else flag=0;
19、r-next=NULL;else flag=0;r-next=NULL;return L return L;单链表查找1)按序号查找按序号查找 算算法法描描述述:设设带带头头结结点点的的单单链链表表的的长长度度为为n,要要查查找找表表中中第第i个个结结点点,则则需需要要从从单单链链表表的的头头指指针针L出出发发,从从头头结结点点(L-next)开开始始顺顺着着链链域域扫扫描描,用用指指针针p指指向向当当前前扫扫描描到到的的结结点点,初初值值指指向向头头结结点点(p=L),用用j做做记记数数器器,累累计计当当前前扫扫描描过过的的结结点点数数(初初值值为为0),当当j=i 时时,指指针针p所所指指
20、的的结结点点就就是是要要找找的的第第i个个结结点点。算算法法实实现现,算法演示。算法演示。L 线性表的操作 Get(L,i)在单链表中i=3时,Get的实现过程:211830754256pppj1 2 3P-data=30 因此,查找第因此,查找第 i 个数据元素的基本个数据元素的基本操作为:操作为:移动指针,比较移动指针,比较 j 和和 i。令指针令指针 p 始终始终指向指向线性表中第线性表中第 j 个数据元素。个数据元素。单链表是一种单链表是一种顺序存取顺序存取的结构的结构,为为找第找第 i 个数据元素个数据元素,必须先找到第必须先找到第 i-1个个数据元素。数据元素。按序号查找算法实现/
21、找第找第i i个结点个结点,找到返回指向它的指针找到返回指向它的指针;否则返回空否则返回空Node*Get(LinkList L,int i)Node*Get(LinkList L,int i)Node *p Node *p;p=L p=L;j=0j=0;/从头结点开始扫描从头结点开始扫描 while(p-next!=NULL)&(jnext!=NULL)&(jnext p=p-next;j+j+;/扫描下一结点扫描下一结点 if if(i=ji=j)return preturn p;/找到了第找到了第i i个结点个结点 else return NULL else return NULL;/找
22、不到找不到,i0,i0或或inin 算法算法时间复杂度时间复杂度为为:O(Length(*L)2)2)按值查找按值查找算算法法描描述述:按按值值查查找找是是指指在在单单链链表表中中查查找找是是否否有有结结点点值值等等于于e e的的结结点点,若若有有的的话话,则则返返回回首首次次找找到到的的其其值值为为e e的的结结点点的的存存储储位位置置,否否则则返返回回NULLNULL。查查找找过过程程从从单单链链表表的的头头指指针针指指向向的的头头结结点点出出发发,顺顺着着链链逐逐个个将将结结点点的的值值和和给给定定值值e e作作比比较较。算算法法实实现现,算算法法演演示。示。按值查找算法实现/查找其结点
23、值等于查找其结点值等于keykey的结点,若找到则返回该结的结点,若找到则返回该结点的位置点的位置p p,否则返回,否则返回NULL*/NULL*/Node*Locate(LinkList L,ElemType key)Node*Locate(LinkList L,ElemType key)Node*p;Node*p;p=L-next;p=L-next;/从表中第一个结点比较从表中第一个结点比较 while(p!=NULL)while(p!=NULL)if(p-data!=key)if(p-data!=key)p=p-next;p=p-next;else break;else break;/找
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课件、代码 数据结构 课件 代码 线性
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内