线性表是由同一类型的数据元素构成的有序序列的线性结构。
线性表的基本操作:
- List MakeEmpty()
- ElementType FindKth(List L, int i)
- Position Find(List L, ElementType X)
- bool Insert(List L, ElementType X, int i)
- bool Delete(List L, int i)
- int Length(List L)
1. 线性表的顺序存储实现
/*这里的位置是数组的整形下标,从0开始;前面提到的位序是指第几个,从1开始。*/
typedef int Position;
typedef struct LNode * PtrToLNode;
struct LNode{
ElementType Data[MAXSIZE];
Postion Last;
};
typedef PtrToLNode List;
- 为了体现数据组织的整体性,通常将数组Data和变量Last封装成一个结构作为顺序表的类型。
- 由于LNode是一个包含数组的结构,当我们实现各种针对顺序表的操作时,直接将该结构作为函数参数传递显然不是个好方法,使用结构指针传递效率更高,所以把List定义为结构指针。
- 结构指针——指向结构类型变量的指针。结构指针可以作为函数参数传递。相比于通过参数直接传递结构,将结构指针作为参数传递不仅可以在函数中修改结构指针所指向的内容,而且参数传递的效率会更高。
- 使用
List L
定义线性表L,通过L可以访问相应线性表的内容。 L->Data[i]
访问下标为 i 的元素L->Last+1
得到线性表的长度
1.1 初始化
顺序表的初始化即构造一个空表。
- 动态分配表结构所需的存储空间
- 将表中
Last指针
置为 -1,表示表中没有数据元素
List MakeEmpty(){
List L;
L = (List)malloc(sizeof(struct LNode));
L->Last = -1;
return L;
}
1.2 查找
#define ERROR -1 /*将错误信息ERROR的值定义为任一负值都可以*/
Position Find(List L, ElementType X){
Position i = 0;
/*只有两种可能跳出循环:1.没有找到,不满足条件一; 2.找到了,不满足条件二*/
while(i <= L->Last && L->Data[i] != X)
i++;
if(i > L->Last)
return ERROR;
else
return i;
}
1.3 插入
顺序表的插入是指在表的第 i (1<= i <= n+1)个位序上插入一个值为 X 的新元素(即在第 i 个元素之前插入新元素),插入后使原长度为 n 的数组元素系列成为 n+1。
/*在L的指定位序 i 前插入一个新元素X; 位序为 i 元素的数组位置下标为 i-1*/
bool Insert(List L, ElementType X, int i){
Position j;
if(L->Last == MAXSIZE-<