一、线性表的定义和基本操作
(一)线性表的定义
线性表是具有相同特性数据元素的一个有限序列。该序列中所含元素的个数叫做线性表的长度,用n(n>=0)表示。注意,n可以等于0,表示线性表是一个空表。
线性表只有一个表头元素,只有一个表尾元素,表头元素没有前驱,表尾元素没有后继,除表头和表尾元素之外,其他元素只有一个直接前驱,也只有一个直接后继。这就是线性表的逻辑特性。
(二)线性表的基本操作
一个数据结构的基本操作是指其最核心、最基本的操作。其他叫复杂的操作可以通过调用其基本操作来实现。线性表的基本操作如下:
初始化表:构造一个空的线性表。
求表长:返回线性表的长度,即线性表中数据元素的个数。
按值查找操作:在表中查找具有给定关键字值的元素。
按位查找操作:获取线性表中第i个位置的元素的值。
插入操作:在表中第i个位置上插入指定元素。
删除操作:删除表中第i个位置的元素,并返回删除元素的值。
输出操作:按前后顺序输出线性表的所有元素值。
判空操作:若线性表是空表,则返回true,否则返回false。
销毁操作:销毁线性表,并释放线性表所占用的内存空间。
线性表的结构只有顺序存储结构和链式存储结构两种,前者称为顺序表,后者称为链表。
二、线性表的顺序存储结构
(一)顺序表的定义
线性表的顺序存储又称为顺序表。它是用一组地址连续的存储单元,依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理地址上也相邻。第一个元素的存储在线性表的起始位置,第i个元素的存储位置后面紧挨着存储的是第i+1个元素。因此,顺序表的逻辑结构与其物理顺序相同。顺序表通过数组实现。
1、顺序表的结构体定义
#define maxSize 100 //定义一个整型常量maxSize,值为100(之后的代码也会使用)
typedef struct
{
int data [maxSize]; //存放顺序表元素的数组
int length; //存放顺序表的长度
}Sqlist; //顺序表类型的定义
一维数组可以是静态分配的(如上),也可以是动态分配的。静态分配时,由于数组的大小和空间事先已经固定,一旦占满空间,再加入新的数据就会产生溢出,导致程序的奔溃。因此也可以通过数组的动态分配在程序执行时开辟额外空间使用。
2、顺序的优缺点
顺序表最主要的特点是随机访问,即可以 通过首地址和元素序号在O(1)时间内找到指定的元素。
顺序表的存储密度高,每个节点只存储数据元素。
顺序表逻辑上相邻的元素物理上也相邻,所以删除和插入操作需要移动大量元素。
(二)顺序表的基本操作
其他操作较为简单,此处主要介绍顺序表的插入操作、删除操作和按值查找操作。
1、插入操作
问题描述:在顺序表L的第p(0<= p <=length,p指数组下标)个位置上插入新的元素e。如果p的输入不正确,则返回0,代表插入失败;如果p的输入正确,则将顺序表第p个元素及以后元素右移一个位置,腾出一个空位置插入新元素,顺序表长度增加1,插入操作 成功,返回1。
插入操作代码如下:
int insertElem (Sqlist &L, int p, int e) //L本身要发生改变,所以用引用型
{
int i;
if (p<0||p>L.length||L.length==maxSize) //位置错误或表长已经达到
return 0; //顺序表的最大允许值,此时插入不成功,返回0
for (i=L.length-1;i>=p;--i)
L.data[i+1] = L.data[i]; //从后往前,逐个将元素往后移动一个位置
L.data[p] = e; //将e放在插入位置p上
++(L.length); //表内元素多了一个,因此表长自增1
return 1; //插入成功,返回1
}
复杂度分析:
最好情况:在表尾插入(p=L.length),元素后移语句不执行,时间复杂度为O(1)。
最坏情况:在表头插入(p=0),元素后移语句将执行L.length次,时间复杂度为O(n)。
平均情况:在长度为n的顺序表中,假设pi(pi=1/(n+1))是在第i个位置上插入一个结点的概率,则插入一个结点所需移动结点的平均次数为
∑ i = 1 n + 1 p i ( n − i + 1 ) = ∑ i = 1 n + 1 1 n + 1 ( n − i + 1 ) = 1 n + 1 ∑ i = 1 n + 1 ( n − i + 1 ) = 1 n + 1 n ( n + 1 ) 2 = n 2 \sum_{i=1}^{n+1}p_{i}{(n-i+1)}=\sum_{i=1}^{n+1}\frac{1}{n+1}{(n-i+1)}=\frac{1}{n+1}\sum_{i=1}^{n+1}{(n-i+1)}=\frac{1}{n+1}\frac{n(n+1)}{2}=\frac{n}{2} i=1∑