顺序表的存储结构和操作方法(基础)
线性表(List)
List为线性表的类型(模板),ElementType为线性表中元素的数据类型,L和X分别为一个线性表和表中元素的实例。
一,顺序表的存储结构定义
其中一种比较简单的方式是使用数据的连续存储空间来存放线性表的各元素。
(1)定义这种存储的数据结构struct应包含几个要素:
1)数组Data[ ] -----用于存放线性表元素
2)数组中线性表最后一个元素的下标位置last-------用于标识线性表的结束位置。
注意:last表示存储空间内线性表最后一个元素的位置,不是存储空间的长度,且每次线性表元素个数(线性表长度)变化时都要更新last,保证last始终在表的最后位置。
(2)存储结构和实现代码如图:




代码解读:
Typedef struct LNode *List; //定义struct LNode *的类型别名 List(即用List定义的变量是指向struct LNode 的指针)
Struct LNode{
ElementType Data[maxsize];
Int last;
}; //定义了一个结构体LNode(相当于类),可以用它创建结构体变量;
Struct LNode L //定义了结构体LNode类型的变量L
List Ptrl; //定义指向结构体LNode类型的指针;
(3)定义存储线性表的结构体后,如何访问线性表元素?结束位置?
访问下标为i的元素:L.data[i] 或者Ptrl->data[i]
访问线性表结束位置:L.last 或者Ptrl->last
二,线性表的操作
(1)创建空的顺序表(初始化)
代码如下:

代码解读:
从函数头看出定义了一个函数MakeEmpty,能返回指向struct LNode类型的指针。
C标准函数malloc( )与free()配对使用;malloc能实现手动(动态)分配内存;
这里 (List)malloc(sizeof(struct LNode)) 系统会分配一个能存放struct LNode类型的内存空间,并返回指向该内存空间的首地址的指针(Void *类型),最后强制转化为List类型后赋值给指针Ptrl.
Last=-1,表示顺序表为空。
最后返回指向内存(首地址)的指针Ptrl。
(2)查找
查找元素X在顺序表ptrl->data[ ]里出现的位置i
//查找
int findX(int x,List ptrl) {
if (ptrl->last=-1)
return - 1;
int start = 0;
int end = ptrl->last;
int mid = (start + end) / 2;
while (ptrl->data[mid]!=x && mid>0){
if (x < ptrl->data[mid]) {
end = mid;
mid= (start + end) / 2;
}
else{
start = mid;
mid = (start + end) / 2;
}
}
if (mid == 0) return -1;
return mid;
}
这里使用了二分法查找,最多查找次数k, last=2^k; 所以k=log(last),查找次数可能是1,2,3,...log(last),时间复杂度为O(log(n))
(3)插入
在顺序表第i个位置前插入一个元素X,需要last~i从后往前整体往后挪动一位,然后更新表尾last++;

代码实现:O(n)
//插入
bool insert(int k,int x,List ptrl) {
if ((ptrl->last)+1>10)return false; //表满了
if(k<0||k>ptrl->last+1) return false; //插入位置不合法
for (int i = ptrl->last; i >= k; i--) {
ptrl->data[i + 1] = ptrl->data[i];
}
ptrl->data[k] = x;
ptrl->last++;
return true;
}
(4)删除
删除线性表中位置为i的元素,需要从i~last从前往后都往前挪动一位,然后更新表尾last--.

代码实现:O(n)
//删除
bool deleteK(int k,List ptrl) {
if (k<0 || k>ptrl->last) return false; //删除位置不合法
for (int i = k; i < ptrl->last; i++) {
ptrl->data[i] = ptrl->data[i + 1];
}
(ptrl->last)--;
return true;
}
















