一个简单的顺序表,较完善

#include<stdio.h>
#include<Windows.h>
typedef int data;
#define MAX_DATA 100
struct S{
	int length;
	data array[MAX_DATA];
}L;
void initlist(S* M);//初始化
void assignment(S* M, int seat, data price);//赋值
void insert(S* M, int seat,data price);//插入
void Delete1(S* M, int seat);//删除位置
void Delect2(S* M, data price);//删除数据

void lookup(S L,int seat);//查找位置
void lookupdata(S L,data price);//查找数据
void full_outup(S M);//全输出


int main()
{
	int seat,choice;
	S L;
	data price;
	initlist(&L);
a:	printf("请输入选择项:1.赋值,2.插入,3.删除指定位置的数据,4.查找位置,5.查找数据,6.输出储存的全部数据,7.删除指定数据\n");
	scanf("%d",&choice);
	switch (choice)
	{
	case 1://赋值,得按顺序从一开始赋值
		printf("请输入seat,顺序从1开始\n");
	      scanf("%d",&seat);
	      printf("请输入price\n");
	      scanf("%d", &price);
	      assignment(&L, seat, price); 
	   goto a;
	   break;

	case 2://插入
		printf("请输入seat\n");
		scanf("%d", &seat);
		printf("请输入price\n");
		scanf("%d", &price);
		insert(&L, seat, price); 
	  goto a;
	  break;

	case 3://删除某个位置的数据
		printf("请输入删除位置seat\n");
		scanf("%d", &seat);
		Delete1(&L,seat); 
	  goto a;
	  break;

	case 4://查找位置与所在数据
		printf("请输入seat\n");
		scanf("%d", &seat);
		lookup(L,seat);
		goto a;
		break;

	case 5://查找数据所在与所在位置
		printf("请输入price\n");
		scanf("%d", &price);
		lookupdata(L, price);
	  goto a;

	case 6:
		full_outup(L);
	  goto a;
	  break;
	case 7:
		printf("请输入需要删除的数price\n");
		scanf("%d", &price);
		Delect2(&L,price);
		goto a;
		break;

	default:printf("程序即将结束\n");
		Sleep(1000);
		printf("再见!\n");
		break;
	}
}
void initlist(S *M)//初始化
{
	M->length = 0;
	printf("初始化成功\n");
}

void assignment(S *M, int seat, data price)//赋值
{
	printf("————————进入赋值操作成功——————\n");
	
	int j = M->length;
	if (seat<0 || (seat - 1)>M->length){ printf("赋值位置错误\n"); };
	if ((seat - 1) == M->length){ M->length++; printf("赋值位置正确"); }//位置从一开始,所以seat-1==下标位置(从0开始),此顺序表不制作空余位置,故每次赋值则开辟一个空间等待存放数据
	M->array[seat - 1] = price;                                          //将数据赋值给刚开辟的空间
	printf("此次输入的数据为%d,位置在%d\n\n",price,seat);
	printf("————————现已拥有%d个数据——————\n",M->length);
}

void insert(S* M, int seat, data price)//插入,每次插入,数据都会增加,所以长度得增加
{
	printf("————————进入插入操作成功——————\n");
//方法1	//if (seat<0 ||(seat-2)>M->length){ printf("长度有误请重试\n"); };//插入位置在第一个位置(下标0)前 或者 插入位置在最后一个位置(下标length)的后面,位置就违法了
	//int j;
	 //M->length++;                                 //先造空间,为后方移动数据提供空间
	
	//for (j=seat; j < M->length; j++)                      //从原本seat位置的数据开始,全体向后移,为要插入在seat位置的数据(price)提供位置
	//{
	//	M->array[j] = M->array[j-1];          
	//}
//方法2
	int j;
	M->length++;                                              //先长度增加为插入提供空间
	if (M->length == MAX_DATA){ printf("长度有误\n"); }
	if (seat<1 || seat>M->length + 1){ printf("长度非法\n"); };
	for (j = M->length; j >seat-1; j--)                      //从原本seat位置的数据开始,全体向后移,为要插入在seat位置的数据(price)提供位置
	{
		M->array[j] = M->array[j-1];
	}
	M->array[seat-1] = price;                                //将数据price插入第seat个位置

	printf("————————现已拥有%d个数据——————\n", M->length);
}

void full_outup(S M)//输出全表数据
{
	printf("————————进入输出表数据操作成功——————\n");
	printf("数据如下:\n");
	if (M.length == 0){ printf("此表现为空\n"); }
	for (int i = 0; i <M.length; i++)
	{
		printf("%5d\n", M.array[i]);
	}
}
void Delete1(S* M, int seat)//删除位置
{
	printf("————————进入删除操作成功——————\n");
	if (seat<0 || seat>M->length){ printf("删除位置错误,请重新输出操作\n"); };//删除位置小于0或者超过结构体长度
	int j = M->length;                      //j等于原结构体长度
	printf("此次删除的位置为%d数据的%d\n",seat,M->array[seat-1]);
	for (seat; j >= seat; seat++)       //结构体数据从seat位置开始依次前移,直接覆盖掉seat原本的数据,数据就删除了,接着只需要改变长度了
	{
		M->array[seat-1] = M->array[seat];
	}
	M->length--;                            //每删除一个数据,结构体长度减一
	printf("————————现拥有%d个数据——————\n", M->length);
}

void lookup(S L, int seat)//查找指定位置
{
	printf("————————进入查找指定位置操作成功——————\n");
	printf("位置%d上的数据为%d\n",seat, L.array[seat - 1]);
}

void lookupdata(S L,int  price)//查找指定数据与其位置
{
	printf("————————进入查找指定数据操作成功——————\n");
	for (int i = 0; i < L.length;i++)
	{
		if (L.array[i] == price)
		{
			printf("您要查找的值是%d,位置在%d\n", L.array[i], i + 1); break;
		}
	}
}

void Delect2(S* M, data price)//删除数据
{
	printf("————————进入删除指定数据操作成功——————\n");
	for (int i=0; i < M->length;i++)
	{ 
		if (price == M->array[i])//找到数据的位置
	      {
			printf("删除的数据是%d,位置在第%d个\n",M->array[i],i+1);
			for (i; i <M->length; i++)
			{
				M->array[i] = M->array[i + 1];
			}
			M->length--;  
		    break;   //每删除一个数据,结构体长度减一
	      } 
	}
	printf("————————现已拥有%d个数据——————\n", M->length);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值