前言
线性表是最常用的一种数据结构,通过元素的线性关系描述元素与元素之间的关系,除了首元素和末尾元素,每个元素都有一个直接前驱和直接后继。元素的类型必须保持相同。
线性表的存储结构
- 顺序存储:把元素放在地址连续的存储单元中,数据集的逻辑关系和物理关系一一对饮。
- 链式存储:地址空间不连续,也就是逻辑上连续,物理上不连续,只支持顺序访问,不支持随机访问。
- 索引存储:索引结构的优点是检索速度快,缺点是增加了附加的索引表,占用更多的存储空间。数据域和指针域分开存放。
- 散列结构:即hash表
线性表的实现方式
顺序表
1、概念:物理结构和逻辑结构一致,表中的元素按照一定的顺序存储到连续的空间中。
2、顺序表存储体结构
#define MAX_SIZE 100 //数组的最大长度
typedef int ElemType; // 数据类型的别名
typedef struct sqlist{
ElemType data[MAX_SIZE]; //存储元素的数组
int length; // 记录线性表的数组元素个数
}sqlist; //别名
3、顺序表的初始化
sqList *L->data = (ElemType *)malloc(sizeof(ElemType)* MAX_SIZE);
顺序表的查找算法
- 按值查找
int findByValue(sqList *L,int e){
int i;
for(i=0;i<L->length;i++){
if(L->data==e){
return i+1;
}
}
return -1;
}
2、按序号查找
int findBySeq(sqList *L,int i){
return L.data[i];
}
3、顺序表的插入
bool ListInsert(sqList *L,int i,int e){
if(i<1 || i>L->length+1){
return false;
}
if(L->length >= MAX_SIZE){
retrun false;
}
for(int j=L->length;j>=i;j--){
L->data[j] = L->data[j-1];
}
L->data[i-1] = e;
L->length++;
return true;
}
4顺序表的删除
bool deleteList(sqList *L,int i,int *e){
if(L->length==0){
return false;//数组为空
}
if(i<1 || i>L-length+1){
return false;
}
e = L->data[i-1];
for(int j=i;j<L-length;j++){
L->data[j-1] = L->data[j];
}
L->length--;
return true;
}