数据结构--c语言--在非递减有序的顺序表中插入一个元素x,保持顺序表有序性。

  1. 实验目的

熟悉将算法转换成程序代码的过程,了解顺序表的逻辑结构特性,熟练掌握顺序表存储结构的C语言描述方法。熟练掌握顺序表的基本操作:查找、插入、删除、合并等,掌握顺序表的随机存取特性。

  1. 实验内容

(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);
}

猜你喜欢

转载自blog.csdn.net/J_SUNV/article/details/84501030