第3章线性表及其存储结构.ppt
《第3章线性表及其存储结构.ppt》由会员分享,可在线阅读,更多相关《第3章线性表及其存储结构.ppt(70页珍藏版)》请在课桌文档上搜索。
1、第3章 线性表及其存储结构,3.1线性表的基本概念3.2线性表的顺序存储及运算3.3线性表的链式存储及运算,3.1 线性表的基本概念,线性表是由 n(n0)个数据元素 a1,a2,an 组成的一个有限序列。表中的每一个数据元素,除了第一个外,有且只有一个前件;除了最后一个外,有且只有一个后件。即线性表或是一个空表或可以表示为:(a1,a2,ai,an)其中 ai(i=1,2,n)是属于数据对象的元素,通常也称其为线性表中的一个结点。,数据元素在线性表中的位置,只取决于它们自己的序号。非空线性表的结构特征为:有且只有一个根结点a1,它无前件;有且只有一个终端结点an,它无后件;除根结点与终端结点
2、外,其他所有结点有且只有一个前件,也有且只有一个后件。线性表中结点的个数n称为线性表的长度。当 n=0时,称为空表。,在稍微复杂的线性表中,一个数据元素还可以由若干个数据项组成。例如,某班的学生情况登记表是一个复杂的线性表,表中每一个学生的情况就组成了线性表中的每一个元素,每一个数据元素包括学号、姓名、性别、入学成绩4个数据项。,3.2线性表的顺序存储及其运算,3.2.1 线性表的顺序存储 线性表的顺序存储结构称为顺序表。,线性表的顺序存储结构具有两个基本特点:线性表中所有元素所占的存储空间是连续的;线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。,假设线性表中的第一个数据元素的存储地址
3、(即首地址)为 ADR(a1),每一个数据元素占k个字节,则线性表中第i个元素ai在计算机存储空间中的存储地址为:ADR(ai)=ADR(a1)+(i-1)k,长度为n的线性表在计算机中的顺序存储结构如图3-1所示。,在程序设计语言中,通常定义一个一维数组来表示线性表的顺序存储空间。应注意数组的基本类型要与线性表中数据元素的类型相同。,数组需要根据情况预设足够的大小,同时还需要一个变量指出线性表在数组中的当前状况,如元素个数或最后一个元素在数组中的位置等。这两方面的信息共同描述一个顺序表,可将它们封装在一起。对C语言,顺序表可定义如下:,对C语言,顺序表可定义如下:#define MaxLen
4、gth 50 typedef int ElemType;typedef struct ElemType listMaxLength;int length;SeqList;今后使用此定义时,MaxLength及ElemType要根据实际问题的需要可重新选定。,3.2.2顺序表的基本运算,1.顺序表的插入 设长度为 n 的顺序表为(a1,a2,ai,an),要在顺序表的第i(1in)个元素ai之前插入一个新 元素x,插入后得到长度为 n+1的线性表(a1,a2,ai-1,x,ai,an),即(a1,a2,ai-1,ai,ai+1,an+1),其中ai 为新插入的元素x,ai+1 为原表中的ai,其
5、余类推,an+1为原表中an。,一般情况下,要在第i(1in)个元素之前插入一个新元素时,首先要从最后一个元素开始,直到第i个元素之间共 n-i+1 个元素依次向后移动一个位置。移动结束时,第i个位置就被空出,然后将新元素插入,插入结束线性表的长度增1。在平均情况下,插入一个新元素,需要移动表中一半的元素。,注意:若最后一个元素之后没有多余的自由空间(即表的大小n=MaxLength)时,那么插入一个元素,将会发生上溢。在顺序表L中的第i个元素之前插入一个新元素x的算法InsertList描述如下:,void InsertList(SeqList*L,int i,ElemType x)int
6、j,n=L-length;if(in+1)printf(n i值不合法);exit(1);if(n=MaxLength)printf(n 表空间上溢);exit(1);,for(j=n-1;j=i-1;j-)L-listj+1=L-listj;/*数据元素依次向后移动一个位置*/L-listi-1=x;/*插入x*/L-length+;/*表长增加1*/,2.顺序表的删除,通常,在长度为 n 的顺序表中,要删除线性表的第i(1in)个元素ai。得到长度为 n-1的线性表(a1,a2,ai-1,ai+1,an)。,即(a1,a2,ai-1,ai,ai+1,an-1),其中ai 为原表中的ai+1
7、,其余类推,an-1为原表中an。,一般情况下,要删除第i(1in)个元素,需要从第i+1 个元素开始,直到第n 个元素之间,共有n-i 个元素依次向前移动了一个位置。删除结束后,顺序表的长度就缩小了。在平均情况下,要在顺序表中删除一个元素,需要移动表中一半的元素。在顺序表L中删除第i个元素并用x 返回其值的算法DeleteList描述如下:,void DeleteList(SeqList*L,int i,ElemType*x)int j,n=L-length;if(in)printf(n i值不合法!);exit(1);,*x=L-listi-1;/*将被删元素的值,赋给*x*/for(j=
8、i;jlistj-1=L-listj;/*元素依次向前移动一个位置*/L-length-;/*表长减少1*/,3.顺序表的初始化 构造一个空的顺序表L(即表的初始化)的算法如下:,void InitList(SeqList*L)/*构造一个空的顺序表L*/L-length=0;/*线性表长度赋0值*/,4.顺序表的长度,确定顺序表L的长度算法如下:int ListLength(SeqList*L)/*求线性表L的长度*/return(L-length);/*返回L的长度*/,5.取顺序表的第i个元素 从顺序表中取第i(1in)个数据元素的算法如下:(用于在表中随机的访问任意一个结点)ElemT
9、ype GetElem(SeqList*L,int i)/*取表中第i个数据元素*/if(iL-length)printf(n i值非法!);exit(1);return(L-listi-1);,6.顺序表的定位运算 根据某个指定的元素值或数据项的值x,对顺序表L进行查找,若L中有元素的值与x相同,则返回首次找到的元素在L中的位置;若查找失败,则返回-1的算法如下:,int LocateElem(SeqList*L,ElemType x)/*查找与x相匹配的元素并返回其位置*/int i=0,n=L-lenth;if(n=0),printf(n Empty List!);exit(1);/*若
10、空表,则返回*/while(ilisti-1!=x)i+;if(in)return(i+1);/*找到返回其位置*/else return(-1);/*查找失败返回-1*/,从上面的讨论可知,在顺序表中插入或删除一个数据元素的时间要消耗在移动元素上,而移动元素的个数取决于表长n及插入或删除元素的位置i。假设在长度为n的顺序表的任意位置i(1in)插入一个元素的概率为pi=1/(n+1),所需移动元素的次数为n-i+1,那么每插入一个元素,所需移动元素的次数的平均值为:Ais=n/2,在表中插入一个元素,平均要移动一半的元素,平均时间复杂度为O(n)。最好的情况是在表尾插入时,不需要移动元素;最
11、坏的情况是在表头插入时,需要移动表中n个元素。,假设,在长度为n的顺序表的任意位置i(1in)删除该位置元素的概率为qi=1/n,所需移动元素的次数为n-i,那么,每删除一个元素,所需移动元素的次数的平均值为:Ade=(n-1)/2,在顺序表中删除一个元素,平均约移动表中一半的元素。平均时间复杂度为O(n)。最好的情况是当i=n,即在表尾删除时,不需要移动元素;最坏的情况是当i=1,即在表头删除时,需要移动表中n-1个元素。,3.3线性表的链式存储及其运算,线性表的顺序存储结构存在缺点 是:插入与删除操作,需大量移动数据元素;再者,在顺序存储结构下,线性表的长度估计困难,并且当有多个顺序表同时
12、共享计算机的存储空间时,不便于对存储空间进行动态分配。,由于线性表的顺序存储结构存在以上缺点,因此,对于大的线性表,特别是元素变动频繁的大线性表,不宜采用顺序存储结构,而是采用下面介绍的链式存储结构。,3.3.1线性表的链式存储,假设数据结构中的每一个数据结点对应于一个存储单元,这种存储单元称为存储结点,简称结点。若每个结点由两部分组成:一部分用于存放数据元素值,称为数据域;另一部分用于存放指针,称为指针域。其中指针用于指向该结点的前一个或后一个结点。通过每个结点的指针域将n个结点按其逻辑顺序连接在一起而构成的数据存储结构,称为链式存储结构。,链式存储结构,既可用来表示线性结构,也可用来表示非
13、线性结构。线性表的链式存储结构,称为线性链表。对线性链表而言,它不要求逻辑上相邻的元素在物理位置上也相邻。其存储单元既可以是连续的,也可以是不连续的,甚至可以零散分布在内存中的任何位置上。,通常,为了适应线性链表的存储,计算机的存储空间被划分成一个一个的小块,每一小块占若干字节,这些小块就是存储结点。存储结点的结构,如图 3-2 所示。,在图中,data域就是数据域(或称值域),next域就是指针域(或称链域),在线性链表中,用一个专门的头指针 head指向线性链表中第一个数据元素的结点(即存放线性链表中第一个数据元素的存储序号)。线性链表中最后一个元素没有后件,因此,线性链表中最后一个结点的
14、指针域为空(用NULL 或0表示),表示链表终止。,用下面例子,来说明线性链表的存储结构。设线性表为(a1,a2,a3,a4),存储空间具有9个存储结点,该线性表在存储空间中的物理存储状态如图3-3(下页)所示。该线性链表的逻辑状态如图3-4所示。,图3-3 线性链表的物理存储状态举例,3.3.2线性链表的基本运算,1.单链表的基本运算单链表结构类型定义如下:typedef struct node ElemType data;/*数值域*/struct node*next;/*指针域*/ListNode,*LinkList;,为了便于实现插入、删除结点的操作,通常在单链表的第一个结点之前增设一
15、个表头结点。该结点的结构与表中其他结点的结构相同,其数据域可以不存储任何信息,也可以存储如线性表的表名、长度等附加信息;其指针域用来存放线性表中的第一个结点的地址。若线性表为空表,则表头结点的指针域为空,设H为单链表的头指针,指向头结点;存储单链表的第一个元素的结点称为开始结点(或称首结点),其指针域存放第二个结点的地址;称存储最后一个元素的结点称终端结点(或称尾结点),其指针域为空,如图3-5所示。,1)建立单链表,依据新结点插入位置的不同,将生成的单链表分为先进先出、后进先出及有序三种。先进先出单链表:在建立单链表时,将每次生成的新结点,总是插入到当前链表的表尾作为尾结点。,若用换行符n作
16、为输入结束标志,用rear作为总是指向链表尾结点的尾指针,则建立带表头结点的先进先出单链表的算法如下:,LinkList CreateList_ff()LinkList H,p,rear;char ch;H=(LinkList)malloc(sizeof(ListNode);/*生成表头结点*/,if(!H)printf(n 存储分配失败);exit(1);H-next=NULL;/*表初值为空*/rear=H;/*尾指针指向表头结点*/while(ch=getchar()!=n)p=(LinkList)malloc(sizeof(ListNode);/*生成新结点*/,if(!p)print
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性 及其 存储 结构

链接地址:https://www.desk33.com/p-740076.html