第2章 线性表

线性结构的特点是,在数据元素的非空有限集合中,除第一个元素无直接前驱结点,最后一个元素无直接后继结点外,其余每个元素有且仅有一个直接前驱结点和一个直接后继结点。

线性表的特征:

(1)同一性 线性表由同类数据元素组成,每一个ai必须属于同一数据对象。

(2)有穷性 线性表由有限个数据元素组成,表长度就是表中数据元素的个数。

(3)有序性 线性表中相邻数据元素之间存在着序偶关系,即<ai,ai+1>。

线性表的运算:

(1)置空表运算setnull(&L):用于将线性表设置成空表。

(2)求长度运算length(L):用于求给定线性表的长度。

(3)取元素运算geti(L,i):若1≤i≤length(L),则取线性表中的第i个元素;否则,取得的元素为NULL。

(4)取元素位置运算locate(L,x):在线性表中查找值等于x的元素的位置,若有多个为x的元素,则以第一个元素的位置为准,若没有x元素,则位置为0。

(5)插入运算insert(&L,x,i):用于在线性表中的第i个位置上插入值为x的元素。

(6)删除运算dele(&L,i):用于删除线性表中第i个位置上的元素。

线性表的顺序存储结构:

线性表顺序表示的优点如下。

(1)无须为表示结点间的逻辑关系而增加额外的存储空间(因为逻辑上相邻的元素其存储的物理位置也是相邻的)。

(2)可以很方便地随机存取表中的任一元素。

线性表顺序表示的缺点如下。

(1)插入或删除运算不方便,除表尾的位置外,在表的其他位置上进行插入或删除操作都必须移动大量的结点,其效率较低。(2)由于顺序表要求占用连续的存储空间,其存储分配只能预先进行静态分配,因此当表长变化较大时,难以确定合适的存储规模。若按可能达到的最大长度预先分配表空间,则可能造成一部分空间长期闲置而得不到充分利用;若事先对表长估计不足,则插入操作可能使表长超过预先分配的空间而造成溢出。

线性表的链式存储结构:

单链表、循环链表、双向链表、静态链表

顺序表和链表的比较

(1)在链表中的每个结点,除了数据域外,还需要额外设置指针(或光标)域,当每个结点的数据域所占字节不多时,指针域所占存储空间的比重就会更大。

(2)在链表中的任何位置上进行插入和删除操作时,都只需要修改指针。而在顺序表中进行插入和删除操作时,平均要移动表中近一半的结点,尤其是当每个结点的信息量较大时,移动结点的时间开销就相当大了。因此,对于频繁进行插入和删除的线性表,宜采用链表做存储结构;若表的插入和删除主要发生在表的首尾两端,则宜采用尾指针表示的单循环链表;而若是按序号存取,则宜采用顺序表。

多项式相加

采用链式存储结构表示多项式时,多项式中的每一个非零系数项构成链表中的一个结点,对于系数为零的项则无需存储。若只存储非零系数项,则必须存储相应的指数信息才行。

两个多项式相加:两个多项式中所有指数相同的项的对应系数相加,若和不为零,则构成“和多项式”中的一项;所有指数不相同的项均复制到“和多项式”中。

本章小结

(1)线性表的逻辑结构特性是数据元素之间存在着线性关系,在计算机中表示这种关系的两类不同的存储结构是顺序存储结构和链式存储结构。用前者表示的线性表简称为顺序表,用后者表示的线性表简称为链表。

(2)熟练掌握两类存储结构的描述方法,注意一维数组的下标从0开始,并掌握链表中指针p和结点*p的对应关系,链表中的头结点、头指针和首元素结点的区别及循环链表、双向链表的特点等。链表是本章的重点和难点。扎实地掌握指针操作和内存动态分配的编程技术是学好本章的基础。

(3)熟练掌握线性表在顺序存储结构上实现基本操作(查找、插入和删除)的算法。

(4)熟练掌握在各种链表结构中实现线性表操作的基本方法,能在实际应用中选用适当的链表结构。

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

三、编程题

1.试设计一算法:从顺序表中删除自第i个元素开始的k个元素。

2.试将一个无序的顺序表A=(11,17,45,23,87,56,19,25),转换成一个按升序排列的有序顺序表(用链表实现)。

3.给出删除单链表中值为k的结点的算法。

4.试给出求单链表长度的算法。

5.试给出在有序链表中插入一值为k的结点的算法。

6.试将入口为head的有序单链表,按所给关键字k分成两个循环链表。其中,比k小的所有结点组成入口为h1的循环链表,比k大的所有结点组成入口为h2的循环链表。

7.试设计一算法来实现顺序表的逆置。

8.对于顺序表,写出下列操作的算法。

(1)从表中删除最小值的元素并由函数返回,空出的位置由最后一个元素补上,若为空表,则显示错误信息并退出运行。

(2)删除表中值为x的结点并由函数返回。

(3)向表中第i个元素之后插入一个值为x的元素。

(4)从表中删除值在x~y之间的所有元素。

(5)将表中的元素排成一个有序表。

(6)从有序表中删除值在x~y之间的所有元素。

9.对于单链表,写出下列操作的算法。

(1)根据一维数组建立一个单链表,使单链表中元素的顺序与数组的次序相同。

(2)统计单链表中值在x~y之间的所有结点个数。

(3)删除单链表中从第k个结点开始连续的j个结点。

(4)将该单链表分解为两个单链表,使其中一个单链表中仅含有奇数,另一个单链表中仅含有偶数。

(5)将另一个已经存在的单链表插入到该链表的第k个结点之后。

(6)将单链表中的所有元素排成一个有序序列。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值