线性顺序表

来源:互联网 发布:温州两家人 知乎 编辑:程序博客网 时间:2024/06/07 15:04

附代码:

线性表

一、线性表定义:
1、线性表的定义
定义:线性表(List):零个或多个数据元素的有限序列。
注意:
1)线性表是一个序列。也就是说,线性表的元素之间是有序的。若元素存在多个,对于其中一个元素来说,它前面的元素叫前驱,后面的元素叫后继。第一个元素无前驱,最后一个元素无后继,中间的元素只有一个前驱,一个后继。
2)线性表是有限的,线性表的元素个数n(n>=0)定义为线性表的长度,当n=0时,称为空表。

2、线性表的操作:
⒈建立一个空线性表
⒉清空一个线性表
⒊判断线性表是否为空
⒋求表长
⒌获得表中第i个位置的元素
⒍确定某元素在线性表中的位置
⒎插入一个新的元素
⒏删除第i个位置的元素
⒐遍历该线性表
二、线性表的顺序存储结构
1、定义存储结构
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
在C语言中,我们可以使用一维数组来实现顺序表的存储结构。即把表的第一个元素数据存放到数组下标为0的位置中,接着把线性表相邻的元素存储到数组中的相邻位置。
线性表的顺序存储结构代码:
#define MAXSIZE 20
typedef struct
{
int data[MAXSIZE];
int length;//length表示的是有效线性表中的有效元素的个数,在创建线性表或者销毁线性表时,length = 0将表中的有效数据置为0
}SqList;
这里要区分线性表长度与数组长度的区别。数组长度是存放线性表的存储空间长度,在编译后这个存储空间就不变了。而线性表长度指的是线性表中的有效数据元素个数,随着线性表的操作,这个数据是变化的。在任意时刻,线性表长度应该小于等于数组长度。
对于顺序表来说,逻辑位置上相邻的两个元素,其在存储位置上也是相邻的。例如a[i]和a[i+1],二者在逻辑结构上是前后关系,在存储结构上也是前后关系。
2、插入与删除
有关于顺序表的相关操作,一些操作是十分简单的。例如:求表长,查询第i个位置元素,置空,遍历等。对于顺序表来说,要掌握它的插入与删除操作。
插入操作
举个例子:一队人在排队买票,这时来了一个插队的,他插入到的队伍的第i个位置,那么在他之后的人都要向后挪一步。
在这个例子中我们已经说明了线性表的顺序存储结构在插入数据时的实现过程。
      插入算法思路:
⒈>如果插入位置不合理,返回异常
⒉>如果线性表长度大于等于数组长度,则返回异常或者增加容量
⒊>从最后一个位置开始向前遍历到第i个位置,分别将它们都向后移动一个位置
⒋>将要插入元素填入位置i处
⒌>表长加1
      删除操作
接着刚才的例子:此时后边排队的人意见很大,这时他冲出了队伍,消失在人群中。于是排队的人群又想蠕虫一样向前移动了一步,队伍又恢复了平静。
这就是线性表的顺序存储结构删除元素的过程。
删除算法思路:
⒈>如果删除位置不合理,返回异常
⒉>如果需要数据则取出删除元素
⒊>从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置
⒋>表长减1
3、线性表顺序存储结构的优缺点
优点:
⒈无需为表示表中元素之间的逻辑关系而额外增加额外的存储空间
⒉可以快速地存取表中任意位置的元素
缺点:
⒈插入和删除操作需要移动大量元素
⒉当线性表长度变化较大时,难以确定存储空间的容量

⒊可能造成存储空间“碎片”


在进行顺序表操作时要注意length表示的时有效数据的个数,其初始值为0,他的大小是比数组下标大一的,和数组的元素个数是相同的,尤其在进行插入和删除操作时要注意判空盘满和是否在操作表尾。

原创粉丝点击