顺序表的建立,插入,删除等操作

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

#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_SIZE 100
#define XZ 10

typedef int Status;
typedef struct{
	int *elem;//对应元素 
	int length;//顺序表长度
	int Sq_rl;//顺序表容量 
}q;

Status chuangjian(q &L,int t);
Status chushihua(q &L,int s);
Status Insert_q(q &L,int e,int pos);
Status Delete_q(q &L,int e,int pos);

Status chuangjian(q &L,int t)
{
	if(chushihua(L,t)!=OK)
	{
		printf("初始化失败,即将退出\n");
		exit(OVERFLOW); 
	}
	printf("初始化成功,请输入%d所生成的顺序表:",t);
	for(int i=0;i<t;i++)
	{
		scanf("%d",&L.elem[i]);
		L.length++;
	}
	return OK;
}

Status chushihua(q &L,int t)
{
	L.elem=(int *)malloc(LIST_SIZE*sizeof(int));
	if(L.elem==NULL)//!L.elem
	exit(OVERFLOW);
	L.length=0;
	L.Sq_rl=LIST_SIZE;
	return OK;
}

Status shuchu(q &L,int n)
{
	printf("所生成的顺序表为:\n");
	if(L.length==0)
	{
		printf("空表\n");
		exit(OVERFLOW);
	}
	for(int i=0;i<L.length;i++)
	{
		printf("%d ",L.elem[i]);
	}
	printf("\n");
	return OK;
}

Status Insert_q(q &L,int e,int pos)
{
	int *newbase,*q,*p;
	if(pos<1||e>L.length+1)
	exit(OVERFLOW);
	if(L.length>=L.Sq_rl)//说明空间不够用了 
	{
		newbase=(int*)realloc(L.elem,(LIST_SIZE+XZ)*sizeof(int));
		if(newbase==NULL)//!newbase 
		{
			exit(OVERFLOW);
		}
		L.elem=newbase;
		L.Sq_rl+=XZ; 
		
	}
	L.length++;
	q=&L.elem[pos-1];//取要插入元素的位置的地址 
	for(p=&L.elem[L.length-1];p>=q;p--){
		*(p+1)=*(p); 
	}
	*q=e;//给指针赋值 
	return OK;
}

Status Delete_q(q &L,int e,int pos)
{
	int *q,*p;
	if(pos<1||pos>L.length)
	{
		exit(OVERFLOW);
	}
	
	p=&L.elem[pos-1];
	for(q=p+1;q<=&L.elem[L.length-1];q++)
	{
		*(q-1)=*q;
	}
	L.length--;
	return OK;
}

int main(void)
{
	q La;
	int n,e,wz;
	printf("请输入顺序表的个数\n");
	scanf("%d",&n);
	if(chuangjian(La,n)!=OK)
	{
		printf("顺序生成表异常,即将退出\n");
		exit(OVERFLOW);//exit函数的使用:非0就会退出,非零状态码表示异常 
	}
	shuchu(La,n);//输出未增删改查的顺序表
	printf("请输入要插入的数据:");
	scanf("%d",&e);
	printf("请输入要插入的位置:");
	scanf("%d",&wz);
	if(Insert_q(La,e,wz)!=OK)
	{
		printf("插入非法!即将退出\n");
		exit(OVERFLOW); 
	}
	shuchu(La,n);//请输入插入之后的顺序表 
	
	printf("请输入要删除的数据:");
	scanf("%d",&e);
	printf("请输入要删除的位置:");
	scanf("%d",&wz);
	if(Delete_q(La,e,wz)!=OK)
	{
		printf("删除位置非法,即将退出\n");
		exit(OVERFLOW); 
	}
	shuchu(La,n);//请输出删除之后的顺序表 

	return 0; 
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值