数据结构课件第2章线性表A.ppt

上传人:wj 文档编号:7849117 上传时间:2023-05-12 格式:PPT 页数:67 大小:780.50KB
下载 相关 举报
数据结构课件第2章线性表A.ppt_第1页
第1页 / 共67页
数据结构课件第2章线性表A.ppt_第2页
第2页 / 共67页
数据结构课件第2章线性表A.ppt_第3页
第3页 / 共67页
数据结构课件第2章线性表A.ppt_第4页
第4页 / 共67页
数据结构课件第2章线性表A.ppt_第5页
第5页 / 共67页
数据结构课件第2章线性表A.ppt_第6页
第6页 / 共67页
数据结构课件第2章线性表A.ppt_第7页
第7页 / 共67页
数据结构课件第2章线性表A.ppt_第8页
第8页 / 共67页
数据结构课件第2章线性表A.ppt_第9页
第9页 / 共67页
数据结构课件第2章线性表A.ppt_第10页
第10页 / 共67页
数据结构课件第2章线性表A.ppt_第11页
第11页 / 共67页
数据结构课件第2章线性表A.ppt_第12页
第12页 / 共67页
数据结构课件第2章线性表A.ppt_第13页
第13页 / 共67页
数据结构课件第2章线性表A.ppt_第14页
第14页 / 共67页
数据结构课件第2章线性表A.ppt_第15页
第15页 / 共67页
数据结构课件第2章线性表A.ppt_第16页
第16页 / 共67页
数据结构课件第2章线性表A.ppt_第17页
第17页 / 共67页
数据结构课件第2章线性表A.ppt_第18页
第18页 / 共67页
数据结构课件第2章线性表A.ppt_第19页
第19页 / 共67页
数据结构课件第2章线性表A.ppt_第20页
第20页 / 共67页
亲,该文档总共67页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构课件第2章线性表A.ppt

《数据结构课件第2章线性表A.ppt》由会员分享,可在线阅读,更多相关《数据结构课件第2章线性表A.ppt(67页珍藏版)》请在冰点文库上搜索。

数据结构课件第2章线性表A.ppt

1,上堂课要点回顾,数据结构课程涉及数学、计算机硬件和计算机软件数据结构定义指互相有关联的数据元素的集合,用D_S=(D,S)表示。

数据结构内容数据的逻辑结构、存储结构和运算算法效率指标时间效率和空间效率,2,数据结构课程的内容,逻辑结构唯一存储结构不唯一运算的实现依赖于存储结构,3,近3周上课内容,第2章线性表第3章栈和队列第4章串第5章数组和广义表,线性结构,若结构是非空有限集,则有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。

可表示为:

(a1,a2,an),线性结构的定义:

(逻辑、存储和运算),4,第二章线性表学习指南,【学习目标】1.了解线性表的逻辑结构特性是数据元素之间存在着线性关系,在计算机中表示这种关系的两类不同的存储结构是顺序存储结构和链式存储结构。

用前者表示的线性表简称为顺序表,用后者表示的线性表简称为链表。

2.熟练掌握这两类存储结构的描述方法以及线性表的基本操作在这两种存储结构上的实现。

3.能够从时间和空间复杂度的角度综合比较线性表两种存储结构的不同特点及其适用场合。

4.结合线性表类型的定义增强对抽象数据类型的理解。

5,【重点和难点】链表是本章的重点和难点。

扎实的指针操作和内存动态分配的编程技术是学好本章的基本要求,分清链表中指针p和结点*p之间的对应关系,区分链表中的头结点、头指针和首元结点的不同所指以及循环链表、双向链表的特点等。

【知识点】线性表、顺序表、链表【学习指南】本章建议完成的算法设计题为:

2.11,2.21,2.19,2.22,2.24,2.27,2.28,2.38,第二章线性表学习指南(续),6,线性结构的特点:

只有一个首结点和尾结点;除首尾结点外,其他结点只有一个直接前驱和一个直接后继。

线性结构表达式:

(a1,a2,an),线性结构包括线性表、堆栈、队列、字符串、数组等等,其中,最典型、最常用的是-,线性表,简言之,线性结构反映结点间的逻辑关系是一对一的,见第2章,7,第二章线性表,2.1线性表的类型定义2.2线性表的顺序表示和实现2.3线性表的链式表示和实现2.3.1线性链表2.3.2循环链表2.3.3双向链表2.4一元多项式的表示及相加,8,线性表:

由一组数据组成,线性表或者是一个空表,或者可以写成(a1,a2,ai,an),其中ai是取自某个集合S的元素。

当1in时,数据元素ai-1称为数据元素ai的直接前驱,而称ai+1为ai的直接后继。

线性表中数据元素的个数称为该线性表的长度。

2.1线性表的类型定义,9,(a1,a2,ai-1,ai,ai1,,an),1.线性表的定义:

用数据元素的有限序列表示,n=0时称为,数据元素,线性起点,ai的直接前趋,ai的直接后继,下标,是元素的序号,表示元素在表中的位置,n为元素总个数,即表长,空表,线性终点,10,形式化定义:

Linearlist=(D,R),其中:

D0为某个数据对象的集合N为线性表长度,11,线性表的主要操作,初始化求长度取元素定位插入删除,12,对线性表可进行如下基本运算:

InitList(&L):

构造一个空的线性表L。

ListLength(&L):

返回L数据元素的个数。

GetElem(L,i,&e):

用e返回L中第i个数据元素的值。

ListInsert(&L,i,e):

在L中第i个位置前插入新的数据元素e,L的长度加1。

ListDelete(&L,i,&e):

删去L中第i个元素,用e返回其值,L的长度减1。

PriorElem(L,cur_e,&pre_e):

用pre_e返回数据元素cur_e的前驱,如果存在的话。

NextElem(L,cur_e,&next_e):

用next_e返回数据元素cur_e的后继,如果存在的话。

LocateElem(L,e,compare():

返回L中第一个与e满足关系compare()的数据元素的位序。

0表示这种元素不存在。

13,例1分析26个英文字母组成的英文表,(A,B,C,D,Z),例2分析学生情况登记表,数据元素都是记录;元素间关系是线性,数据元素都是字母;元素间关系是线性,同一线性表中的元素必定具有相同特性,14,例3、学生健康情况登记表如下:

15,例4、一副扑克的点数(2,3,4,J,Q,K,A),16,从以上例子可看出线性表的逻辑特征是:

在非空的线性表,有且仅有一个开始结点a1,它没有直接前趋,而仅有一个直接后继a2;有且仅有一个终端结点an,它没有直接后继,而仅有一个直接前趋an-1;其余的内部结点ai(2in-1)都有且仅有一个直接前趋ai-1和一个直接后继ai+1。

17,线性表是一种典型的线性结构。

数据的运算是定义在逻辑结构上的,而运算的具体实现则是在存储结构上进行的。

抽象数据类型的定义为:

P19,18,算法2.1例2-1利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A=AB。

voidunion(Listif(!

LocateElem(La,e,equal)ListInsert(La,+La-len,e)/for,19,算法2.2p21例2-2巳知线性表LA和线性表LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的元素仍按值非递减有序排列。

此问题的算法如下:

20,voidMergeList(listla,listlb,list/while,21,while(I=la-len)getelem(la,I+,ai);listinsert(lc,+k,ai);/while处理la表while(j=lb-len)getelem(lb,j+,bj);listinsert(lc,+k,bi);/while处理lb表/MergeList,22,练:

判断下列叙述的正误:

1.数据的逻辑结构是指数据元素之间的逻辑关系,是用户按使用需要建立的。

2.线性表的逻辑结构定义是唯一的,不依赖于计算机。

3.数据结构是指相互之间存在一种或多种关系的数据元素的全体。

4.线性结构反映结点间的逻辑关系是一对一的。

一维向量是线性表,但二维或N维数组不是。

“同一数据逻辑结构中的所有数据元素都具有相同的特性”是指数据元素所包含的数据项的个数都相等。

23,2.2线性表的顺序表示和实现,2.2.1顺序表的表示2.2.2顺序表的实现2.2.3顺序表的运算效率分析,本节小结,作业,24,2.2.1顺序表的表示,用一组地址连续的存储单元依次存储线性表的元素,可通过数组Vn来实现。

把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。

线性表的顺序表示又称为顺序存储结构或顺序映像。

顺序存储定义:

顺序存储方法:

简言之,逻辑上相邻,物理上也相邻,25,线性表顺序存储特点:

1.逻辑上相邻的数据元素,其物理上也相邻;2.若已知表中首元素在存储器中的位置,则其他元素存放位置亦可求出(利用数组下标)。

计算方法是(参见存储结构示意图):

设首元素a1的存放地址为LOC(a1)(称为首地址),设每个元素占用存储空间(地址长度)为L字节,则表中任一数据元素的存放地址为:

LOC(ai)=LOC(a1)+L*(i-1)LOC(ai+1)=LOC(ai)+L,注意:

C语言中的数组的下标从0开始,即:

Vn的有效范围是V0Vn-1,26,线性表的顺序存储结构示意图,地址内容元素在表中的位序,1,i,2,n,空闲区,i+1,L,b=LOC(a1),b+L,b+(i-1)L,b+(n-1)L,b+(max-1)L,27,一个一维数组,下标的范围是到,每个数组元素用相邻的个字节存储。

存储器按字节编址,设存储数组元素的第一个字节的地址是,则的第一个字节的地址是,113,例1,因此:

LOC(M3)=98+5(3-0)=113,解:

地址计算通式为:

LOC(ai)=LOC(a1)+L*(i-1),28,用数组V来存放26个英文字母组成的线性表(a,b,c,z),写出在顺序结构上生成和显示该表的C语言程序。

voidbuild()/*字母线性表的生成,即建表操作*/inti;V0=a;for(i=1;i=n-1;i+)Vi=Vi-1+1;,核心语句:

法1Vi=Vi-1+1;法2Vi=a+i;法3Vi=97+i;,例2,29,voidmain(void)/*主函数,字母线性表的生成和输出*/n=26;/*n是表长,是数据元素的个数,而不是V的实际下标*/build();display();,voiddisplay()/*字母线性表的显示,即读表操作*/inti;for(i=0;i=n-1;i+)printf(%c,Vi);printf(n);,执行结果:

abcdefghijklmnopqrstuvwxyz,30,2.2.2顺序表的实现(或操作),回忆:

数据结构基本运算操作有:

修改、插入、删除、查找、排序,1)修改通过数组的下标便可访问某个特定元素并修改之。

核心语句:

Vi=x;,显然,顺序表修改操作的时间效率是T(n)=O

(1),31,2)插入在线性表的第i个位置前插入一个元素,实现步骤:

将第n至第i位的元素向后移动一个位置;将要插入的元素写到第i个位置;表长加1。

注意:

事先应判断:

插入位置i是否合法?

表是否已满?

应当有1in+1或i=1,n+1,for(j=n;j=i;j-)aj+1=aj;ai=x;n+;,/元素后移一个位置,/插入x,/表长加1,核心语句:

32,由于C语言中的一维数组也是采用顺序存储表示,故可以用数组类型来描述顺序表。

用结构类型来定义顺序表类型。

#defineListSize100typedefintDataType;typedefstrucDataTypedataListSize;intlength;Sqlist;,33,线性表的插入运算是指在表的第I(1in+1)个位置上,插入一个新结点x,使长度为n的线性表(a1,ai-1,ai,an)变成长度为n+1的线性表(a1,ai-1,x,ai,an),34,算法2.3P23VoidInsertList(Sqlist*L,DataTypex,intI)intj;if(Il.length+1)printf(“Positionerror”);returnERROR;,35,if(L.length=ListSize)printf(“overflow”);exit(overflow);for(j=L.length-1;j=I-1;j-)L.dataj+1=L.dataj;L.dataI-1=x;L.length+;,36,在线性表的第i个位置前插入一个元素的示意图如下:

插入25,37,实现步骤:

将第i至第n位的元素向前移动一个位置;表长减1。

注意:

事先需要判断,删除位置i是否合法?

应当有1in或i=1,n,3)删除删除线性表的第i个位置上的元素,for(j=i+1;j=n;j+)aj-1=aj;n-;,/元素前移一个位置,/表长减1,核心语句:

38,删除顺序表中某个指定的元素的示意图如下:

39,顺序表插入和删除的完整程序可自行用C语言编制。

自行上机练习题:

设有线性表LA(3,5,8,11)和LB=(2,6,8,9,11,15,20);若LA和LB分别表示两个集合A和B,求新集合AAUB(并操作,相同元素不保留);,注:

此题来源于教材的例2.1和例2.2,见P20,按规律插入,插入到尾部,预测输出:

LA=(3,5,8,11,2,6,9,15,20)将LA与LB表归并,要求仍有序(相同元素要保留)预测输出:

LC=(2,3,5,6,8,8,9,11,11,15,20),40,2.2.3顺序表的运算效率分析,算法时间主要耗费在移动元素的操作上,因此计算时间复杂度的基本操作(最深层语句频度)T(n)=O(移动元素次数)移动元素的个数取决于插入或删除元素的位置.,思考:

若插入在尾结点之后,则根本无需移动(特别快);若插入在首结点之前,则表中元素全部要后移(特别慢);若要考虑在各种位置插入(共n+1种可能)的平均移动次数,该如何计算?

讨论1:

若在长度为n的线性表的第i位前插入一元素,则向后移动元素的次数f(n)为:

f(n)=,ni+1,时间效率分析:

41,讨论2:

若在长度为n的线性表上删除第i位元素,向前移动元素的次数f(n)为:

f(n)=,思考:

若删除尾结点,则根本无需移动(特别快);若删除首结点,则表中元素全部要前移(特别慢);若要考虑在各种位置删除(共n+1种可能)的平均移动次数,该如何计算?

ni,可以证明:

插入、删除操作平均需要移动一半元素(n/2)插入、删除算法的平均时间复杂度为:

O(n),显然,顺序表的空间复杂度S(n)=O

(1)(没有占用辅助空间),42,证明:

假定在每个元素位置上插入x的可能性都一样(即概率P相同),则应当这样来计算平均执行时间:

将所有位置的执行时间相加,然后取平均。

若在首结点前插入,需要移动的元素最多,后移n次;若在a1后面插入,要后移n-1个元素,后移次数为n-1;若在an-1后面插入,要后移1个元素;若在尾结点an之后插入,则后移0个元素;所有可能的元素移动次数合计:

0+1+n=n(n+1)/2,所以平均移动次数为:

n(n+1)/2(n+1)n/2O(n),共有多少种插入形式?

连头带尾有n+1种,同理可证:

顺序表删除一元素的时间效率为:

T(n)=(n-1)/2O(n),43,教材P25算法2.5也是对执行效率的推导:

假定在表中任意位置插入、删除元素都是等概率的,插入概率p(i)=1/(n+1),删除概率q(i)=1/n,则:

插入操作时间效率(平均移动次数),删除操作时间效率(平均移动次数),44,本节小结,线性表顺序存储结构特点:

逻辑关系上相邻的两个元素在物理存储位置上也相邻;优点:

可以随机存取表中任一元素;缺点:

在插入,删除某一元素时,需要移动大量元素。

为克服这一缺点,我们引入另一种存储形式:

链式存储结构,见2.3节,45,2.3线性表的链式表示和实现,2.3.1链表的表示2.3.2链表的实现2.3.3链表的运算效率分析,本节小结,作业,46,2.3.1链表的表示,链式存储结构特点:

其结点在存储器中的位置是随意的,即逻辑上相邻的数据元素在物理上不一定相邻。

如何实现?

通过指针来实现,注意:

每个存储结点都包含两部分:

数据域和指针域,47,例1画出26个英文字母表的链式存储结构。

该字母表在内存的链式存放示意图如下:

解:

该字母表的逻辑结构为:

(a,b,y,z),各结点由两个域组成:

数据域:

存储元素数值数据;指针域:

存储直接后继或者直接前驱的存储位置。

样式:

48,与链式存储有关的术语:

1、结点:

数据元素的存储映像。

由数据域和指针域两部分组成;2、链表:

n个结点由指针链组成一个链表。

它是线性表的链式存储映像,称为线性表的链式存储结构。

3、单链表、双链表、多链表、循环链表:

结点只有一个指针域的链表,称为单链表或线性链表;有两个指针域的链表,称为双链表;有多个指针域的链表,称为多链表;首尾相接的链表称为循环链表。

循环链表示意图:

49,4、头指针、头结点和首元结点,示意图如下:

头指针,头结点,首元结点,头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针;头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息;首元结点是指链表中存储线性表第一个数据元素a1的结点。

50,2.3.1线性链表链表是指用一组任意的存储单元来依次存放线性表的结点,这组存储单元即可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。

因此,链表中结点的逻辑次序和物理次序不一定相同。

为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息,这个信息称为指针(pointer)或链(link)。

这两部分组成了链表中的结点结构:

51,其中:

data域是数据域,用来存放结点的值。

next是指针域(亦称链域),用来存放结点的直接后继的地址(或位置)。

链表正是通过每个结点的链域将线性表的n个结点按其逻辑次序链接在一起的。

由于上述链表的每一个结只有一个链域,故将这种链表称为单链表(SingleLinked)。

显然,单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。

同时,由于终端结点无后继,故终端结点的指针域为空,即null(图示中也可用表示)。

例1、线性表:

(bat,cat,eat,fat,hat,jat,lat,mat),52,单链表示意图如下:

110130135160头指针head165170200205,53,head,bat,cat,eat,mat,单链表是由表头唯一确定,因此单链表可以用头,指针的名字来命名。

例如:

若头指针名是head,则把链表称为表head。

用C语言描述的单链表如下:

Typedefchardatatype;,Typedefstructnodedatatypedata;structnode*next;listnode;,54,typedeflistnode*linklist;listnode*p;linklisthead;注意区分指针变量和结点变量这两个不同的概念。

P为动态变量,它是通过标准函数生成的,即p=(listnode*)malloc(sizeof(listnode);函数malloc分配了一个类型为listnode的结点变量的空间,并将其首地址放入指针变量p中。

一旦p所指的结点变量不再需要了,又可通过标准函数free(p)释放所指的结点变量空间。

55,指针变量P和(其值为结点地址)和结点变量*P之间的关系。

56,1.链式存储特点:

逻辑上相邻,物理上不一定相邻,链表存放示意图如下:

讨论1:

每个存储结点都包含两部分:

数据域和。

讨论2:

在单链表中,除了首元结点外,任一结点的存储位置由指示。

其直接前驱结点的链域的值,指针域(链域),57,2.与链式存储有关的术语,1)结点:

数据元素的存储映像。

由数据域和指针域两部分组成;2)链表:

n个结点由指针链组成一个链表。

它是线性表的链式存储映像,称为线性表的链式存储结构。

3)单链表、双链表、多链表、循环链表:

结点只有一个指针域的链表,称为单链表或线性链表;有两个指针域的链表,称为双链表;有多个指针域的链表,称为多链表;首尾相接的链表称为循环链表。

4)头指针、头结点和首元结点,以教材P27图2.5和图2.6内容为例说明。

58,何谓头指针、头结点和首元结点?

头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针。

单链表可由一个头指针唯一确定。

头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息;首元结点是指链表中存储线性表第一个数据元素a1的结点。

59,一个线性表的逻辑结构为:

(ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG),其存储结构用单链表表示如下,请问其头指针的值是多少?

例:

答:

头指针是指向链表中第一个结点的指针,因此关键是要寻找第一个结点的地址。

31,头指针的值是31,60,上例链表的逻辑结构示意图有以下两种形式:

区别:

无头结点有头结点,61,答:

讨论1.在链表中设置头结点有什么好处?

讨论2.如何表示空表?

头结点即在链表的首元结点之前附设的一个结点,该结点的数据域中不存储线性表的数据元素,其作用是为了对链表进行操作时,可以对空表、非空表的情况以及对首元结点进行统一处理,编程更方便。

答:

无头结点时,当头指针的值为空时表示空表;有头结点时,当头结点的指针域为空时表示空表。

62,讨论3.头结点的数据域内装的是什么?

头结点的数据域可以为空,也可存放线性表长度等附加信息,但此结点不能计入链表长度值。

答:

讨论4.链表的数据元素有两个域,不再是简单数据类型,编程时该如何表示?

因每个结点至少有两个分量,所以要采用结构数据类型。

答:

什么是结构类型?

如何书写表达?

补充C语言内容,头结点的数据域,63,3.补充结构数据类型及其C语言表示法,类型定义和变量说明可以合写为:

structmytest/mytest是自定义结构类型名称chardata;/定义数据域的变量名及其类型structmytest*next;/定义指针域的变量名及其类型test,*head;/test是用户自定义的mytest类变量,以26个字母的链表为例,每个结点都有两个分量:

假设每个结点用变量test表示,其中两个分量分别用data和*next表示,则:

64,补充:

结构类型的C语言表示法,对于指向结构变量test首地址的指针,还可说明为:

structmytest*p,*q;,每个结点的分量如何表示?

方式1:

直接用test.dataa;test.next=q方式2:

先让指针变量p指向该结点的首地址,然后用:

p-data=a;p-next=q;方式3:

先让指针变量p指向该结点的首地址,然后用:

(*p).data=a;(*p).nextq,65,设p为指向链表的第i个元素的指针,则第i个元素的数据域写为,指针域写为。

至此应可看懂教材P28对于单链表的抽象描述,和教材P22关于顺序表的抽象定义。

练习:

p-data,ai的值,p-next,ai+1的地址,66,附2:

教材P22关于顺序表的抽象定义:

Typedefstruct/若后面不再用,可省略结构名ElemType*elem;/表基址intlength;/表长(特指元素个数)intlistsize;/表当前存储容量(字节数)SqList;,TypedefstructLnodeElemTypedata;/数据域structLnode*next;/指针域Lnode,*LinkList;/*LinkList为Lnode类型的指针,附1:

教材P28对于单链表的抽象描述:

67,补充:

结构类型的C语言表示法,介绍三个有用的库函数(都在中):

sizeof(x)计算变量x的长度;malloc(m)开辟m字节长度的地址空间,并返回这段空间的首地址;free(p)释放指针p所指变量的存储空间,即彻底删除一个变量。

问1:

自定义结构类型变量test的长度m是多少?

问2:

结构变量test的首地址(指针p)是多少?

问3:

怎样删除结构变量test?

只能借助其指针删除!

msizeof(test),p(test*)malloc(m),free(p),

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2