《第2章线性表及其应用》习题解答

上传人:工**** 文档编号:557277362 上传时间:2024-01-05 格式:DOC 页数:41 大小:297.01KB
返回 下载 相关 举报
《第2章线性表及其应用》习题解答_第1页
第1页 / 共41页
《第2章线性表及其应用》习题解答_第2页
第2页 / 共41页
《第2章线性表及其应用》习题解答_第3页
第3页 / 共41页
《第2章线性表及其应用》习题解答_第4页
第4页 / 共41页
《第2章线性表及其应用》习题解答_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《《第2章线性表及其应用》习题解答》由会员分享,可在线阅读,更多相关《《第2章线性表及其应用》习题解答(41页珍藏版)》请在金锄头文库上搜索。

1、第2章 线性表及其应用本章学习要点掌握线性表的逻辑结构及相关概念。掌握线性表的两种基本存储结构,即线性顺序表(顺序表)和线性链表(链表)的存储结构。体会线性表在各种存储方式之间的差异及其各自的优缺点。熟练掌握顺序表和链表上各种基本操作的实现过程。灵活运用顺序表和链表的特点解决实际应用问题。线性表(Linear List)是一种最基本、最常用的数据结构。线性表有两种基本存储表示方法,即顺序存储表示和链表表示。线性表的基本操作主要有插入、删除和查找等。本章将具体给出线性表的定义、存储结构、基本操作及其算法实现,最后给出线性表的应用实例。2.1线性表的定义和基本运算2.1.1线性表的定义线性表是n(

2、n0)个同类型数据元素(记录或结点)的有限序列:a0,a1,a2,an-1。记为:Ln=(a0,a1,a2,an-1)。其中:a0是开始结点,an-1是终端结点,ak是ak+1的直接前驱结点,而ak+1是ak的直接后继结点(k=0,1,2,n-2);终端结点an-1没有后继结点,开始结点a0没有前驱结点;元素ai(i=0,1,2,n-1)在表中的位置为i+1;元素的个数n称为线性表L的长度,长度为零的线性表叫空表。需要说明的是:在C/C+语言中,数组元素的下标是从0开始的,具有n个数据元素的数组A的所有元素为A0,A1,An-1。在线性表的定义中,第i个元素的下标为i-1,即元素的位置等于其下

3、标加1。日常生活中,线性表的例子很多:【例2.1】L10=(1,3,5,7,9,2,4,6,8,10)是一个线性表。其中的数据元素是整数,该线性表的长度为10。按表中的排列顺序,元素1是第一个元素没有前驱,元素10是最后一个元素没有后继。【例2.2】L36=(0,1,2,3,4,5,6,7,8,9,A,B,C,D,X,Y,Z)是一个线性表。其中的数据元素是所有数字字符和所有大写字母字符,线性表的长度为36。按表中的排列顺序,元素0是第一个元素没有前驱,元素Z是最后一个元素没有后继。【例2.3】由图2.1所示的学生基本情况表L7也是一个线性表。线性表中的元素是由5个数据项组成的纪录,表的长度为7

4、。2.1.2线性表的基本操作线性表的基本运算主要有以下几种:(1)初始化InitList(&L):构造一个空线性表L的运算。(2)提取GetElem(L,i,&e):提取表L中第i个元素的值到e的运算。(3)修改SetElem(&L,i,e):修改表L中第i个元素的值为e的运算。(4)查找LocateElem(L,e):查找表L中第一个值与e相同的元素的位置。(5)插入InsertList(&L,i,e):将e插入到表L中的第i个位置。(6)删除DeleteList(&L,i,&e):删除表L中的第i元素,并用e返回该元素的值。(7)求表长Length(L):返回线性表L的长度。(8)遍历Tr

5、averseList(L):依次输出L中每个元素的值。在线性表的其它操作中,有些操作可以通过调用基本操作来实现,有些操作比如线性表的排序和归并等操作的实现将在以后的章节中进行。2.2线性表的顺序存储表示与实现2.2.1线性表的顺序存储1顺序表概念一个线性表在计算机中可以用不同的方法来存储,其中最简单和最常用的一种存储方式是将线性表中的所有元素,按照其逻辑顺序依次存储到计算机内存中的从指定位置开始的一块连续的存储单元中。用这种存储方式表示的线性表称为线性顺序表简称顺序表。设顺序表中元素的首地址为,每个元素需要占用的字节数为,则表中任一元素的存储位置可用下面的公式算出:顺序表中各元素在内存中所占的

6、位置如图2.2所示。2顺序表的结构定义顺序表的存储结构和一维数组的存储结构极为相近;但是由于在线性表中允许执行插入和删除等操作,也就是说一个线性表的长度是可变的,为适应这种情况在C+语言中用以下结构类型来表示顺序表。typedef int ElemType; /为了方便上机调试程序,本章假定数据元素的类型为整型const int MAXLEN=100; /定义顺序表存储空间大小的初始分配常量const int INCSIZE=50; /定义顺序表存储空间的扩充常量值struct SqList /定义顺序表的结构类型为SqList ElemType *elem; /存储空间的基址 int len

7、gth; /线性表的长度 int listsize; /当前表的存储容量 int incsize; /一次增补的容量值 ;在以上结构表示下,许多关于线性表的运算(如存、取、求线性表的长度和置表空等操作)极易实现。以下主要讨论关于顺序表的插入、删除、查找和遍历等操作。2.2.2顺序表中基本操作的实现1初始化操作InitList_Sq(&L)该操作的功能是构造一个空线性顺序表L。算法思想(1)在堆空间中为线性表动态分配一块连续的存储单元,返回首地址到elem;(2)置线性表的长度值length为0;(3)置表的当前容量listsize为动态分配时的大小;(4)置容量扩充值incsize的大小为IN

8、CSIZE。线性表L的初始化存储结构如图2.3所示。算法实现void InitList_Sq(SqList &L,int maxlength=MAXLEN,int incsize=INCSIZE)L.elem=new ElemTypemaxlength;/动态分配一个长度为maxlength的连续存储空间,类型为ElemType,返回首地址到L.elemL.length=0;L.listsize=maxlength;L.incsize=incsize;2提取操作GetElem_Sq(L,i,&e)该操作将顺序表L中第i个元素的值赋值到e中,如果提取成功返回1否则返回0。算法实现int GetE

9、lem_Sq(SqList L,int i,ElemType &e)if(iL.length)return 0; /如果位置i不合理时返回0值elsee=L.elemi-1; /通过参数e得到第i个元素的值return 1;3修改操作SetElem_Sq(&L,i,e)修改操作将线性表L中第i个元素的值修改为e,如果修改成功返回1否则返回0。算法实现int SetElem_Sq(SqList &L,int i,ElemType e) if(iL.length)return 0; else L.elemi-1=e;return 1; 4查找操作LocateElem_Sq(L,e)查找操作的功能是

10、查找顺序表L中第一个值与e相同的元素的位置,如果查找成功返回1查找失败返回0。算法实现int LocateElem_Sq(SqList L,ElemType e)int i=0;while(iL.length&L.elemi!=e)i+;if(iL.length)return i+1;else return 0;算法分析查找运算的基本操作为表中元素与数据e的比较。假定表的长度为n,每个位置找到的机会都是相同的,即第i个位置找到的概率为,那么查找操作的平均比较次数为:。查找的时间复杂度是按最坏的情况来考虑,即查找的是最后一个元素或找不到该元素,其比较次数为n次,所以查找的时间复杂度为:。5插入操

11、作InsertList_Sq(&L,i,e)插入操作的功能是将元素e插入到顺序表L中L.elem的第i个位置,同时修改L的长度。如果插入成功返回1,不成功返回0。算法思想(1) 先编写函数IncSize(&L),其功能是将顺序表L的最大存储量增加L.incsize个元素的空间;(2) 如果插入的位置i不合理返回0,表示插入不成功;(3) 如果当前线性表的长度已经达到最大容量值L.listsize,则调用函数IncSize(&L)扩充容量;(4) 将L.elem中第i个以后的所有元素都依次向后移动一个位置,为第i个元素的插入留出一个空位;(5) 置L中第i个元素的值为e;(6) 将表的长度加1;

12、(7) 返回值1表示插入成功。算法实现void IncSize(SqList &L)/该函数的功能是另分配一个存储区并将L的最大存储量增加L.incsize个记录的空间ElemType *a=new ElemTypeL.listsize+L.incsize;for(int i=0;iL.length;i+)ai=L.elemi; /将L.elem中的元素复制到数组a中deleteL.elem; /收回L.elem所占空间L.elem=a; /让L.elem指向aL.listsize+=L.incsize; /修改最大存储空间int InsertList_Sq(SqList &L,int i,E

13、lemType e)int k;if(iL.length+1)return 0; /插入位置不合理时返回0值if(L.length=L.listsize)IncSize(L);for(k=L.length,i-;ki;k-)L.elemk=L.elemk-1; /为第i个元素的插入留出一个空位L.elemi=e;L.length+; /修改长度return 1;算法分析从以上算法可见,在不考虑扩容的情况下,插入运算的时间主要花费在元素的向后移动上。假定表的长度为n,每个位置插入的机会都是相同的,即第i个位置插入的概率为,那么插入操作平均移动元素的次数为:。插入操作的时间复杂度是按最坏的情况考虑

14、,即插入到表中开始的位置,所以元素的移动次数为n次,时间复杂度为。6删除操作DeleteList_Sq(&L,i,&e)删除操作的功能是删除顺序表L中的第i元素,并返回该元素的值到e中。如果操作成功返回1,否则返回0。算法思想(1)如果删除的位置i不合理返回0,表示删除操作不成功;(2)置e的值为L中第i个元素的值; (3)将L中第i个以后的所有元素都依次向前移动一个位置;(4)将表的长度减1;(5)返回值1表示删除成功。算法实现int DeleteList_Sq(SqList &L,int i,ElemType &e)if(iL.length)return 0; /如果删除的位置i不合理返回0e=L.elemi-1; /置e的值为L中第i个元素的值while(iL.length) /将L中第i

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 习题/试题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号