- 实验目的
熟悉将算法转换成程序代码的过程,了解顺序表的逻辑结构特性,熟练掌握顺序表存储结构的C语言描述方法。熟练掌握顺序表的基本操作:查找、插入、删除、合并等,掌握顺序表的随机存取特性。
- 实验内容
(1)在非递减有序的顺序表中插入一个元素x,保持顺序表有序性
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 10//线性表存储空间的初始分配量
#define LISTINCREMENT 5//线性表存储空间的分配增量
#define OVERFLOW 0
#define OK 1
typedef struct{
int *elem;//顺序表的基地址
int length;//顺序表的长度
int listsize;//顺序表的存储空间
}Sqlist;
//初始化一个线性表
int InitList(Sqlist *l){
l->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!l->elem){
printf("存储空间分配失败!\n");
exit(OVERFLOW);
}
l->length = 0;
l->listsize = LIST_INIT_SIZE;
return OK;
}
//在某个位置插入特定元素
int ListInsert(Sqlist *l,int i,int e){
if(!l->length){
l->length++;
l->elem[l->length-1] = e;
return OK;
}else if(i<1||i>l->length+1){
printf("插入的位置有误,无法插入数据!\n");
exit(OVERFLOW);//程序异常退出
}
if(l->length==l->listsize){//存储空间已经满了 需要重新申请
int *newbase;
newbase = (int *)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(int));
if(!newbase){
printf("存储空间分配失败!\n");
exit(OVERFLOW);
}
l->elem = newbase;
l->listsize += LISTINCREMENT;
}
int *p;
p = l->elem+l->length-1;
while(p>=l->elem+i-1) *(p+1) = *p--;
l->elem[i-1] = e;
l->length++;
return OK;
}
//将元素插入到有序线性表中
int Insert(Sqlist *l,int e){
int i=0,*p=l->elem+l->length-1;//i是插入位置的下标
while(e>=l->elem[i]) i++;
if(l->length==l->listsize){
int *newbase;
newbase = (int *)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(int));
if(!newbase){
printf("存储空间分配失败!\n");
exit(OVERFLOW);
}
l->elem = newbase;
l->listsize += LISTINCREMENT;
}
while(p>=l->elem+i) *(p+1)=*p--;
l->elem[i] = e;
l->length++;
return OK;
}
//输出线性表
void PrintList(Sqlist *l){
for(int i=0;i<l->length;i++){
printf("%d ",l->elem[i]);
}
}
main(){
int flag=1,i=1,num;//i表示的是第几个位置 而不是下标 所以在初始化i值时是从1开始而不是0
Sqlist l;
InitList(&l);
printf("请按递增顺序输入线性表中的元素:\n");
while(flag){//给线性表赋值
int num;
scanf("%d",&num);
ListInsert(&l,i,num);
i++;//最终停止输入时i-1就是线性表的length 因为最后自增了一下但却没有给这个位置赋值
printf("\n是否要继续输入?0 no , 1 yes\t");
scanf("%d",&flag);
}
PrintList(&l);
printf("请输入您想插入的数据:\n");
scanf("%d",&num);
Insert(&l,num);//用自己编写的方法插入元素
/*//调用已知插入函数
i=1; //i还是表示插入的位置
while(num>=l.elem[i-1]&&i<=l.length) i++;
ListInsert(&l,i,num);*/
printf("插入后的结果为:\n");
PrintList(&l);
}