在非递减有序的顺序表中插入一个元素x,保持顺序表有序性。

直接上代码

#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;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值