2.1.2 线性表的顺序存储实现
什么是线性表
由同种数据元素构成的有序序列的存储结构。
线性表的元素个数称为表长;
线性表没有元素时称为空表;
线性表的起始位置称为表头,线性表的结束位置称为表尾。
线性表的顺序存储实现
实质上是结构数组。
#define MAXSIZE 10
typedef struct LNode *List;
struct LNode{
int Data[MAXSIZE];
int last;//线性表的长度
};
初始化
线性表的初始化,即建立一个空线性表。
List MakeEmpty(){
List PtrL;
PtrL=(List)malloc(sizeof(struct LNode));
PtrL->last=-1;
return PtrL;
}
疑问:动态分配空间大小怎么确定?
查找
int Find(List PtrL,int X){
int i=0;
while(i<=PtrL->last && PtrL->Data[i]!=X){
i++;
if(i>PtrL->last)//没找到
return -1;
else
return i;
}
}
插入
第 i 个位置插入元素X,其中 i=1,2,3,…,MAXSIZE
考虑情况:
- 表空表满
- 非空非满
- 插入位置合法与否
void Insert(List PtrL,int i,int X){
if(PtrL->last==MAXSIZE){
printf("表满,无法插入!");
return;
}
if(i<1 || i>MAXSIZE){
printf("插入位置不合法!");
return;
}
if(PtrL->last==-1){//空表插入
PtrL->last=1;
PtrL->Data[0]=X;
}else{
int j;
for(j= PtrL->last;j>=i;j--){
PtrL->Data[j]=PtrL->Data[j-1];//相应元素倒序后移
}
PtrL->Data[j]=X;
PtrL->last++;
}
}
删除
删除第 i 个位置的元素,其中 i=1,2,3,…,MAXSIZE
考虑情况:
- 表空与否
- 所删除位置合法与否
void Delete(List PtrL,int i){
if(PtrL->last==-1){
printf("空表无法删除!\n");
return;
}
if(i<1 || i>PtrL->last){
printf("位置不合法!\n");
return;
}
int j;
for(j=i-1;j<PtrL->last;j++){
PtrL->Data[j]=PtrL->Data[j+1];//相应元素顺序前移
}
PtrL->last--;
}
展示
void Display(List PtrL){
if(PtrL->last==-1){
printf("表空!\n");
return;
}
int i=0;
while(i<PtrL->last){
printf("%d\n",PtrL->Data[i]);
i++;
}
}
测试
主函数
int main(){
List L=MakeEmpty();
Insert(L,1,1) ;
Insert(L,2,2) ;
Insert(L,3,3) ;
Display(L);
Delete(L,1);
Display(L);
Delete(L,4);
Display(L);
printf("%d\n",Find(L,2));
printf("%d\n",Find(L,20));
return 0;
}