这段时间准备将书上的数据结构全部自己实践一遍。
线性表是有序和有限的,分顺序存储和链式存储。
本篇记录c语言实现顺序存储代码。
# include <stdlib.h>
# include <stdio.h>
# define MAXSIZE 100
# define ELEMENT int
typedef struct{
ELEMENT ele[MAXSIZE];
int last;
}SQLIST;
int initial(SQLIST **p){ //初始化链表
*p=(SQLIST *)malloc(sizeof(SQLIST));
if (!p)return -1;
else{
(*p)->last=-1;
return 0;
}
}
int insert(SQLIST *p,int i,ELEMENT a){//插入数据 i位置插入,数据为a
if(p->last==MAXSIZE){
printf("数据已满\n");
return -1;
}
else{
if(i<=(p->last+1)&&i>-1){
if(i==p->last+1){//末尾插入
p->ele[i]=a;
p->last+=1;
return 0;
}
else{//非末尾插入
int count;
for(count=p->last;count>=i;count--){
p->ele[count+1]=p->ele[count];
}
p->ele[i]=a;
p->last+=1;
return 0;
}
}
else{
printf("插入位置有误\n");
return -1;
}
}
}
void multiinsert(SQLIST *p){//多次插入数据
int n,num,pos,sig;
ELEMENT a;
printf("请输入插入数据个数\n");
scanf("%d",&num);
for(n=0;n<num;n++){
printf("请输入插入的数据\n");
scanf("%d",&a);
printf("请输入插入数据的位置(0-%d)\n",(p->last)+1);
scanf("%d",&pos);
sig = insert(p,pos,a);
if (sig == -1)break;
int i;
printf("插入完成后线性顺序表为\n");
for(i=0;i<=p->last;i++){
printf("%d,",p->ele[i]);
}
}
}
void deletelist(SQLIST *p){//删除元素
printf("请输入删除第几个元素\n");
int q,num;
scanf("%d",&q);
if(1<=q&&q<=p->last+1){
for(num=q-1;num<p->last;num++){
p->ele[num]=p->ele[num+1];
}
p->last=p->last-1;
int i;
printf("删除完成后线性顺序表为\n");
for(i=0;i<=p->last;i++){
printf("%d,",p->ele[i]);
}
}
else{
printf("删除位置出错\n");
}
}
int main(){
SQLIST *p;
int sig;
sig = initial(&p);
while(sig==-1){//分配失败重新分配
sig = initial(&p);
}
multiinsert(p);
deletelist(p);
}