ImageVerifierCode 换一换
格式:DOCX , 页数:36 ,大小:182.39KB ,
资源ID:19851096      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/19851096.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第2章线性表文档格式.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第2章线性表文档格式.docx

1、线性表L存在,插入位置 1in+1(为插入前的表长),操作结果是在线性表L的第 i 个位置上插入一个值为 x 的新元素,这样使原序号为 i , i+1, . , n 的数据元素的序号变为 i+1,i+2, . , n+1,插入后表长=原表长+1。Delete_List(L,i):删除操作线性表L存在,删除位置1in(为删除前的表长),操作结果是在线性表L中删除序号为i的数据元素,删除后使序号为 i+1, i+2,., n 的元素变为序号为 i, i+1,.,n-1,新表长=原表长-。 某数据结构上的基本运算,不是它的全部运算,而是一些常用的基本的运算,而每一个基本运算在实现时也可能根据不同的存

2、储结构派生出一系列相关的运算来。比如线性表的删除运算还会有删除某个特定值的元素; 再如插入运算,也可能是将新元素插入到适当位置上等等,不可能也没有必要定义出它的全部运算,读者掌握了某一数据结构上的基本运算后,其它的运算可以通过基本运算来实现,也可以直接去实现。在上面各操作中定义的线性表仅仅是一个抽象在逻辑结构层次的线性表,尚未涉及到它的存储结构,因此每个操作在逻辑结构层次上尚不能用具体的某种程序设计语言写出具体的算法,而算法只有在存储结构确立之后才能实现。2.2 线性表的顺序存储及运算实现2.2.1 顺序表线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形

3、式存储的线性表称为顺序表。因为内存中的地址空间是线性的,因此,用物理上的相邻实现数据元素之间的逻辑相邻关系是既简单,又自然的。如图 2-1 所示。设 a的存储地址为Loc(a),每个数据元素占d个存储地址,则第i个数据元素的地址为: Loc(ai)=Loc(a)+(i-1)*d 1in这就是说只要知道顺序表首地址和每个数据元素所占地址单元的个数就可求出第i个数据元素的地址来,这也是顺序表具有按数据元素的序号随机存取的特点。在程序设计语言中,一维数组在内存中占用的存储空间就是一组连续的存储区域,因此,用一维数组来表示顺序表的数据存储区域是再合适不过的。考虑到线性表的运算有插入、删除等运算,即表长

4、是可变的,因此,数组的容量需设计的足够大,设用:dataMAXSIZE来表示,其中MAXSIZE是一个根据实际问题定义的足够大的整数,线性表中的数据从 data0 开始依次顺序存放,但当前线性表中的实际元素个数可能未达到MAXSIZE多个,因此需用一个变量 last 记录当前线性表中最后一个元素在数组中的位置,即 last 起一个指针的作用,始终指向线性表中最后一个元素,因此,表空时last=-1。这种存储思想的具体描述可以是多样的。如可以是:DataType dataMAXSIZE; int last;这样表示的顺序表如图2-1 所示。表长为 last+1,第一个到第n个数据元素分别存放在d

5、ata0到datalast中。这样使用简单方便,但有时不便管理。1i-1in-1 MAXSIZE1-1Dataa1a2ai-1aiai+1an 图2-1 线性表的顺序存储从结构性上考虑,通常将 data 和 last 封装成一个结构作为顺序表的类型:typedef struct DataType dataMAXSIZE;int last;SeqList; SeqList L ; /定义一个顺序表这样表示的线性表如图2-2(a)所示。表长=L.last+1,线性表中的数据元素a1至an分别存放在L.data0至L.dataL.last中。由于我们选用C语言表述数据结构的存储及算法的实现,根据C语

6、言中的一些规则,有时定义一个指向SeqList 类型的指针更为方便:SeqList *L ;L是一个指针变量,线性表的存储空间通过 L=new SeqList操作(VC语句,不同的语言版本可能有所不同)来获得。L中存放的是顺序表的地址,这样表示的线性表如图2-2(b)所示。表长表示为(*L).last1或 L-last+1,线性表的存储区域为 L-data ,线性表中数据元素的存储空间为: L-data0 L-dataL-last。在以后的算法中多用这种方法表示,读者在读算法时注意相关数据结构的类型说明。2.2.2 顺序表上基本运算的实现顺序表的初始化顺序表的初始化即构造一个空表,这对表是一个

7、加工型的运算。因此,将L设为指针参数,首先动态分配存储空间,然后,将表中 last 指针置为-1,表示表中没有数据元素。算法如下:SeqList *init_SeqList()SeqList *L;L=new SeqList;last=-1;return L;【算法2-1】 顺序表的初始化算法设调用函数为主函数,主函数对初始化函数的调用如下: main() SeqList *L; L=Init_SeqList(); 插入运算 线性表的插入是指在表的第i个位置上插入一个值为 x 的新元素,插入后使原表长为 n的表:(a1,a2,. ,ai-1,ai,ai+1,. ,an)成为表长为 n+1表:(

8、a1,a2,.,ai-1,x,ai,ai+1,.,an) 。i 的取值范围为1in+1 。 顺序表上完成这一运算则通过以下步骤进行: 将aian 顺序向下移动,为新元素让出位置; 将 x 置入空出的第i个位置; 修改 last 指针(相当于修改表长),使之仍指向最后一个元素。int Insert_SeqList(SeqList *L,int i,DataType x)int j; if (L-last=MAXSIZE-1) cout”表满”endl; return -1;/表空间已满,不能插入 if (iL-last+2)/检查插入位置的正确性”位置错”;return(0);for (j=L-

9、last;j=i-1;j-)dataj+1=L-dataj; /结点移动 datai-1=x;/新元素插入last+; /last仍指向最后元素 return 1;/插入成功,返回【算法2-2】 顺序表的插入算法性能分析:顺序表上的插入运算,时间主要消耗在了数据的移动上,在第i个位置上插入x ,从ai 到 an 都要向下移动一个位置,共需要移动ni1个元素,而i的取值范围为 :1in+1,即有n1个位置可以插入。设在第i个位置上作插入的概率为Pi,则平均移动数据元素的次数: (2-2)设:Pi=1/(n+1),即为等概率情况,则: (2-3)这说明:在顺序表上做插入操作需移动表中一半的数据元素

10、。显然时间复杂度为(n)。 a x ai 0 1 i-2 i-1 i n-1MAXSIZE-1 插入前 插入后 图2-3 顺序表中的插入本算法中注意以下问题: 顺序表中数据区域有MAXSIZE个存储单元,所以在向顺序表中做插入时先检 查表空间是否满了,在表满的情况下不能再做插入,否则产生溢出错误。 要检验插入位置的有效性,这里 i 的有效范围是:1in+1,其中 n 为原表长。 注意数据的移动方向。删除运算 DeleteList(L,i) 线性表的删除运算是指将表中第 i 个元素从线性表中去掉,删除后使原表长为 n 的线性表: (a1,a2,. ,ai-1,ai,ai+1,.,an)成为表长为

11、 n-1 的线性表: (a1,a2,. ,ai-1, ai+1,. ,an)。i 的取值范围为:1in 。 顺序表上完成这一运算的步骤如下: 将ai+1an 顺序向上移动。 修改last指针(相当于修改表长)使之仍指向最后一个元素。i-2 删除前 删除后 图2-4 顺序表中的删除算法如下:int Delete_SeqList(SeqList *L,int i)last+1) /检查空表及删除位置的合法性”不存在第i个元素”return 0;for (j=i;jj+)dataj-1=L- /向上移动last-;return 1; /删除成功【算法 2-3】 顺序表的删除算法与插入运算相同,其时间

12、主要消耗在了移动表中元素上,删除第i个元素时,其后面的元素 ai+1an 都要向上移动一个位置,共移动了n-i 个元素,所以平均移动数据元素的次数: (2-4)在等概率情况下,pi=1/n,则: (2-5)这说明顺序表上作删除运算时大约需要移动表中一半的元素,显然该算法的时间复杂度为(n)。本算法注意以下问题:删除第i个元素,i的取值为 1in ,否则第i个元素不存在,因此,要检查删除位置的有效性。当表空时不能做删除,因表空时 L-last的值为-1,条件(ilast+1)也包括了对表空的检查。删除 ai 之后,该数据已不存在,如果需要,先取出 ai,再做删除。按值查找线性表中的按值查找是指在

13、线性表中查找与给定值x相等的数据元素。在顺序表中完成该运算最简单的方法是:从第一个元素 a1 起依次和x比较,直到找到一个与x相等的数据元素,则返回它在顺序表中的存储下标或序号(二者差一);或者查遍整个表都没有找到与 x 相等的元素,返回-1。int Location_SeqList(SeqList *L,DataType x)int i;i=0; while (ilast)return -1; elsereturn i; /返回的是存储位置【算法2-4】 顺序表的按值查找算法本算法的主要运算是比较。显然比较的次数与x在表中的位置有关,也与表长有关。当 a1=x 时,比较一次成功。当 an=x

14、 时比较 n 次成功。平均比较次数为(n+1/2,时间性能为O(n)。2.2.3 顺序表应用举例 【例2-1】将顺序表 (a1,a2,. ,an) 重新排列为以 a1 为界的两部分:a1 前面的值均比 a1 小,a1 后面的值都比 a1 大(这里假设数据元素的类型具有可比性, 不妨设为整型),操作前后如图2-5所示,这一操作称为划分,a1 也称为基准。划分的方法有多种,下面介绍的划分算法其思路简单,但性能较差。 基本思路:从第二个元素开始到最后一个元素,逐一向后扫描:当前数据元素 ai 比 a1 大时,表明它已经在 a1 的后面,不必改变它与 a1 之间的位置,继续比较下一个。 当前结点若比

15、a1 小,说明它应该在 a1 的前面,此时将它上面的元素都依次向下移动一个位置,然后将它置入最上方。25302060103515. 划分前 划分后 图2-5 顺序表的划分根据上述思想,划分算法如下:void part(SeqList *L)int i,j; DataType x,y;x=L-data0; /将基准置入 x 中 for (i=1;ii+)dataidatai; for (j=i-1;=0;j-) /移动 Ldata0=y; 【算法2-5】 顺序表划分算法本算法中,有两重循环,外循环执行n1次,内循环中移动元素的次数与当前数据的大小有关,当第个元素小于a1 时,要移动它上面的 i-

16、1个元素,再加上当前结点的保存及置入,所以移动i-1+2次,在最坏情况下,a1 后面的结点都小于a1 ,故总的移动次数为 : (2-6) 即最坏情况下移动数据时间性能为()。这个算法简单但效率低,在第10章的快速排序中时我们将介绍另一种划分算法,它的性能为(n)。【例2-2】有顺序表A和B,其元素均按从小到大的升序排列,编写一个算法将它们合并成一个顺序表C,要求C的元素也是从小到大的升序排列。算法思路:依次扫描A和B的元素,比较当前的元素的值,将较小值的元素赋给C,如此直到一个线性表扫描完毕,然后将未完的那个顺序表中余下部分赋给C即可。C的容量要能够容纳A、B两个线性表相加的长度。void m

17、erge(SeqList A,SeqList B,SeqList *C)int i,j,k;j=0;k=0;while (i=A.last & j=B.last)if (A.dataidatak+=A.datai+;elsedatak+=B.dataj+;=A.last )while (j=B.last )last=k-1;【算法2-6】 有序表的合并算法算法的时间性能是O(m+n),其中m是A的表长,n是B的表长。【例2-3】比较两个线性表的大小。两个线性表的比较依据下列方法:设A、B是两个线性表,均用向量表示,表长分别为 m 和 n 。 A和B分别为 A 和 B 中除去最大共同前缀后的子表

18、。例如A=(x,y,y,z,x,z), B=(x,y,y,z,y,x,x,z),两表最大共同前缀为 (x,y,y,z)。则A=(x,z),B=(y,x,x,z);若A=B= 空表,则A=B;若A=空表且B空表,或两者均不空且A首元素小于B首元素,则AB。首先找出A、B的最大共同前缀;然后求出A和B,之后在按比较规则进行比较,AB 函数返回1;A=B返回0;AB返回-1。int compare(int A,int B,int m,int n) int i,j,AS,BS,ms,ns; /AS,BS作为A,B i=0; ms=ns=0;=m & i0 | ms0 & AS0data,指针域为 (*

19、p).next 或 p-next。Delete p则表示释放 p 所指的结点。如果申请失败,返回空指针。因此申请结点后应判断其返回地址是否为空,空指针则表明没得到结点,不能继续进行。在本教材中为了突出算法的逻辑,方便读者,认为每次申请结点成功,因此不再判断。2.3.2 单链表上基本运算的实现建立单链表在链表的头部插入结点建立单链表链表与顺序表不同,它是一种动态管理的存储结构,链表中的每个结点占用的存储空间不是预先分配,而是运行时系统根据需求而生成的,因此建立单链表从空表开始,每读入一个数据元素则申请一个结点,然后插在链表的头部,如图2-10 展现了线性表:(25,45,18,76,29)之链表的建立过程,因为是在链表的头部插入,读入数据的顺序和线性表中的逻辑顺序是相反的。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1