C语言实现数据结构顺序表的基本操作

该代码实现了顺序表的基本操作,包括初始化、创建、插入、删除、获取元素、查找位置、输出、判断是否为空、查找前驱和后继元素。通过用户友好的菜单进行交互,适用于数据结构教学或简单数据管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define MAXSIZE 1000 //顺序表能达到的最大长度
#define SIZECREATE 100 
#define OK 1
#define ERROR 0
//return 0:返回假,正常终止 
//return 1:返回真,非正常终止 

//typedef可用来自定义数据类型
typedef int ElemType;
typedef int Status;

typedef struct Sqlist{
	ElemType *elem; //创建存储空间的基地址 
	int length; //定义顺序表当前长度 
	int listSize; //当前分配的存储容量 
}Sqlist; //顺序表的结构类型为Sqlist 


void menu(){
	printf("************************************\n");
	printf("***********顺序表功能实现***********\n");
	printf("******(0) 退出程序******************\n");
	printf("******(1) 初始化线性表**************\n");
	printf("******(2) 创建线性表****************\n");
	printf("******(3) 插入元素******************\n");
	printf("******(4) 删除元素******************\n");
	printf("******(5) 获取指定位置元素的值******\n");
	printf("******(6) 查找元素的位置************\n");
	printf("******(7) 输出顺序表****************\n");
	printf("******(8) 判断线性表是否为空********\n");
	printf("******(9) 求指定元素的前驱元素******\n");
	printf("******(10) 求指定元素的后继元素*****\n");
	printf("************************************\n");
	printf("************************************\n");
	printf("\n");
}

//初始化线性表 
Status InitList(Sqlist *L){ //构造一个空的顺序表L 
	L->elem=(ElemType*)malloc(sizeof(ElemType)*MAXSIZE); //为顺序表L分配一个新的存储空间,大小为MAXSIZE 
	if(!L->elem){
		printf("内存分配失败!\n");
		exit(0);   //异常处理 
	}
	L->length = 0; //初始顺序表的长度为0 
	L->listSize=MAXSIZE;
	printf("内存分配成功!\n");
}

//创建顺序表 
void CreateList(Sqlist *L){
	int n;
	int i;
	printf("请输入你要创建的顺序表的元素的个数:");
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d",&L->elem[i]); //在这里显示让你接着输入元素 
		L->length+=1;
	} 
} 

//打印线性表
void DipList(Sqlist L){
	int i=0;
	for(i=0;i<L.length;i++){
		printf("%d",L.elem[i]);
	}
	printf("\n");
} 

//判断线性表是否为空
int ListEmpty(Sqlist L){
	if(L.length==0){
		return 1;
	}else{
		return 0;
	}
} 

//返回一个指定元素的前驱元素
int PriorElem(Sqlist L,ElemType e1,ElemType *e2){
	int i=0;
	for(i=0;i<L.length;i++){ //在下标为0到下标为L.length的范围循环 
		if(L.elem[i]!=e1){  //如果线性表L中下标i的元素不等于指定元素e1 
			continue;       //结束本次循环,进入下一次循环 
		}else{
			break;     //如果等于,结束循环 
		}
	}
	if(i!=0){
		*e2=L.elem[i-1]; //e2为e1前驱元素 
		return 1;
	}else{
		return 0;
	}
} 

//返回一个指定元素的后继元素 
int NextElem(Sqlist L,ElemType e1,ElemType *e2){
	int i=0;
	for(i=0;i<L.length;i++){
		if(L.elem[i]!=e1){
			continue;
		}else{
			break;
		}
	}
	if(i!=L.length-1){
		*e2=L.elem[i+1];
		return 1;
	}else{
		return 0;
	}
}

//顺序表的取值(根据位置i获取该位置对应的元素e)
Status GetElem(Sqlist L,int j,ElemType *e){
	if(j<1||j>L.length){
		return ERROR;   //异常处理 
	}	
	*e = L.elem[j-1];
	return OK;
} 

//顺序表的查找
int LocateElem(Sqlist L,ElemType e){ 
	int i;
	for(i=0;i<L.length;i++){
		if(L.elem[i]==e){
			return i+1; //查找元素的位置 
		}	
	}
	
	return 0;
}

//顺序表的插入
Status ListInset(Sqlist *L,int j,ElemType e){
	int i=0;
	printf("请输入你想要插入的元素:");
	scanf("%d",&e);
	printf("请输入你想要插入的位置:");
	scanf("%d",&j);
	if(j<1||j>L->length+1){ // j表示元素位置
	    printf("插入的位置非法!"); 
		exit(0);
	}
	if(L->length>=MAXSIZE){ //内存空间满了,增加分配 
		ElemType *newbase=(ElemType*)realloc(L->elem,(L->listSize+SIZECREATE)*sizeof(ElemType));
		if(!newbase){
		 printf("内存分配失败!\n");
		 return ERROR;
	} 
		L->elem=newbase; //新基地址 
		L->listSize=L->listSize+SIZECREATE; //增加存储容量 
	} 
	for(i=L->length-1;i>=j-1;i--){ //从顺序表中最后一个元素开始,i表示元素下标(下标从0开始)
		L->elem[i+1]=L->elem[i];  //把下标i的元素赋值给i+1这个位置 
	}
	L->elem[j-1]=e; //插入元素下标=插入位置-1 
	L->length+=1;
	return OK;
} 

//顺序表的删除
Status ListDelete(Sqlist *L,int j){
	int i;
	printf("请输入想要删除第几个元素:");
	scanf("%d",&j);
	if(j<1||j>L->length){
		printf("删除元素位置为无效!\n");
		return 0;
	}
	for(i=j;i<=L->length-1;i++){
		L->elem[i-1]=L->elem[i];
	}
	L->length-=1;
	return OK;
} 



int main(){
	Sqlist L;
	int key,i,j,k,a,b;
	ElemType e;
	menu();
	
	while(1){
		printf("请选择功能(0-10):");
		scanf("%d",&key);
		switch(key){
			case 1: //初始化线性表 
				InitList(&L);
				break;
			case 2: //创建线性表
				CreateList(&L);
				break;
			case 3: //插入元素
				ListInset(&L,j,e); 
				break;
			case 4: //删除元素 
				ListDelete(&L,j);
				break;
			case 5: //获取指定位置元素的值
				printf("请输入你想要知道位置的元素:");
                scanf("%d",&j);
                GetElem(L,j,&e);
                printf("第%d个元素的值为:%d\n",j,e);
                break;
			case 6: //查找元素的位置
			    printf("请输入你想要查找的元素:");
                scanf("%d",&e);
                j=LocateElem(L,e);
                printf("%d在线性表中的位置是:%d\n",e,j);
                break;
			case 7: //打印顺序表 
				DipList(L);
				break;
			case 8: //判断线性表是否为空
				j=ListEmpty(L);
                if(j==1)
                    printf("线性表为空表\n");
                else
                {
                    printf("线性表非空\n");
                }
                break;
			case 9: //求指定元素的前驱元素
				printf("请输入你想知道的前驱元素的值:");
				scanf("%d",&a);
				j=PriorElem(L,a,&b);
				if(j==1){
					printf("%d的前驱元素是:%d\n",a,b);
				}
				if(j==0){
					printf("此元素无前驱元素\n");
				}
				break;
			case 10: //求指定元素的后继元素 
				printf("请输入你想知道的后继元素的值:");
				scanf("%d",&a);
				j=NextElem(L,a,&b);
				if(j==1)
				{
					printf("%d的后继元素是:%d\n",a,b);
				} 
				if(j==0)
				{
					printf("此元素无后继元素\n"); 
				}
				break;
			default:
				exit(0);
				break;
		}
	}
return 0;
}


//操作会引起线性表变化时,就需要用到SqList *L。没用引起变化时用SqList L

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值