直接上代码
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 10//顺序表存储空间的初始分配量
#define LISTINCREMENT 5// 顺序存储空间的分配增量
#define OVERFLOW 0
#define ok 1
typedef struct{
int *element;//顺序表的基地址
int length;//顺序表的长度
int listsize;//顺序表的存储空间
}Sqlist;
//初始化一个顺序表
int InitList(Sqlist *l){
l->element=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!l->element){
printf("无法申请内存空间!\n");
exit(OVERFLOW);
}
l->length=0;//将长度初始化为0
l->listsize=LISTINCREMENT;//初始存储容量
return ok;
}
//在某个位置插入一个元素
int ListInsert(Sqlist *l,int i,int e) {
if(!l->length){//如果刚开始还没有元素,那就进行以下操作
l->length++;
l->element[l->length-1]=e;
return ok;//这一步就是直接结束该函数
}
else if(i<1||i>l->length+1){//这里为什么不是l->length,而是l->length+1呢?
printf("输入的位置有误!\n");//l->length+1就表示在最后一个,这也算是插入,只不过是插在了最后一个位置,后面没有元素了
return OVERFLOW;
}
if(l->length==l->listsize){//当刚开始的分配空间用完时,就要新开辟空间了
int *newbase;
newbase=(int *)realloc(l->element,(l->listsize+LISTINCREMENT)*sizeof(int));
if(!newbase){
printf("申请内存失败!\n");
return OVERFLOW;
}
l->element=newbase;
l->listsize+=LISTINCREMENT;
//return ok;
}
int *p;
p=l->element+l->length-1;//将工作指针移到最后一个元素,注意要-1,因为在数组中,开始的下标为0
while(p>=l->element+i-1)
*(p+1)=*p--;
l->element[i-1]=e;
l->length++;
return ok;
}
//将元素插入顺序表中
int Insert(Sqlist *l,int e){
int i=0,*p=l->element+l->length-1;
while(e<=l->element[i])
i++;
if(l->length==l->listsize){
int *newbase;
newbase=(int *)realloc(l->element,(l->listsize+LISTINCREMENT)*sizeof(int));
if(!newbase){
printf("无法申请内存!\n");
return OVERFLOW;
}
l->element=newbase;
l->listsize+=LISTINCREMENT;
}
while(p>=l->element+i)
*(p+1)=*p--;
l->element[i]=e;
l->length++;
return ok;
}
//输出顺序表中的数据
void OutList(Sqlist *l){
int i;
for(i=0;i<l->length;i++)
printf("%d ",l->element[i]);
printf("\n");
}
int main(){
int flag=1,i=1,num;
Sqlist l;
InitList(&l);
printf("请按非递减顺序输入数据\n");
while(flag){
scanf("%d",&num);
ListInsert(&l,i,num);
i++;
printf("是否要继续输入?no 0,yes 1\n");
scanf("%d",&flag);
}
OutList(&l);
printf("请输入您要插入的数据\n");
scanf("%d",&num);
Insert(&l,num);
printf("最后的结果为:\n");
OutList(&l);
return 0;
}