顺序表操作(插,删,修,查)

1.头文件声明

 

#ifndef N
#define N

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXSIZE 10
typedef struct
{
	int date[MAXSIZE];
	int len;//这里没有赋值,系统可能会给一个随机值,影响结果
}seqlist;
void menue();
seqlist *creat();
int full(seqlist *list);
int insert_rear(int e,seqlist *list);
int empty(seqlist *list);
int output(seqlist *list);
int delete(seqlist *list);

int find_sub(seqlist *list,int sub);
int revise_sub(seqlist *list,int sub,int e);
int input_sub(seqlist *list,int sub,int e);
int delete_sub(seqlist *list,int sub);

int find_date(seqlist *list,int key);
int delete_date(seqlist *list,int key);
int revise_date(seqlist *list,int key,int e);
int input_date(seqlist *list,int key,int e);

int sort(seqlist *list);


seqlist *free_space(seqlist *list);

#endif

 2.顺序表分步操作

 2.1顺序表堆区空间创建

//在堆区创建空间
seqlist *list=creat();//创建顺序表空间
menue();//显示菜单
int number;
-----------------------------
#include"head.h"
void menue()
{
	puts("****************");
	puts("1.表尾部插入:");
	puts("2.表尾部删除:");
	puts("3.顺序表遍历输出:");
	puts("");
	puts("4.顺序表按下标查找:");
	puts("5.顺序表按下标修改:");
	puts("6.顺序表按下标插入:");
	puts("7.顺序表按下标删除:");
	puts("");
	puts("8.顺序表按元素查找:");
	puts("9.顺序表按元素删除:");
	puts("10.顺序表按元素修改:");
	puts("11.顺序表按元素插入:");
	puts("");
	puts("12.顺序表排序:");
	puts("13.顺序表去重:");
	puts("14.顺序表有序合并:");
	puts("15.顺序表空间释放:");
	puts("");
	puts("0.退出整个程序:");
	puts("****************");
}	
seqlist *creat()
{
	seqlist *list=(seqlist *)malloc(sizeof(seqlist));
	if(list==NULL)
	{
		return NULL;
	}
	//申请成功,下面清0
	list->len=0;//就是初始化,让len从0开始计算
	return list;
}

2.2顺序表表尾插入

	switch(number)
	{
		case 1:
		{
			int n;int e;
			printf("输入尾插入个数:");
			scanf("%d",&n);
			for(int i=0;i<n;i++)
			{
				printf("输入插入的元素:");
				scanf("%d",&e);//
				insert_rear(e,list);
			}
		puts("");
		}break;
----------------------------------------------

//判断是否为满
int full(seqlist *list)
{
	return list->len==MAXSIZE?-1:0;
}

//插入元素
int insert_rear(int e,seqlist *list)
{   //判断顺序表是否满
	if(list==NULL||list->len==MAXSIZE)//失败
	{
		printf("插入失败\n");
		return -1;
	}
	//可以插入
	list->date[list->len]=e;//原本[]这里面是len,但是调用len需要用指针->
	list->len++;
	return 0;
}

2.3顺序表表尾删除 

	case 2:
		{
			delete(list);
			puts("");
		}break;
------------------------------
//删除元素
int delete(seqlist *list)
{
	if(list==NULL||empty(list))
	{
		printf("删除失败\n");
		return -1;
	}
	list->len--;//让len往前走,不输出后面,删除是无法直接删掉的
	printf("删除成功\n");
	return 0;
}

 

 2.4顺序表遍历输出

 

	case 3:
		{
			output(list);
			puts("");

------------------------------------------
//判断是否为空
int empty(seqlist *list)
{
	return list->len==0?-1:0;
}

//遍历输出元素
int output(seqlist *list)
{//判断list是否为空或者为NULL如果是的就没有往下继续的必要
	if(list==NULL||list->len==0)
	{
		printf("顺序表为空\n");
		return -1;
	}
	//成功
	for(int i=0;i<list->len;i++)
	{
		printf("%d\t",list->date[i]);
	}
	puts("");
}

2.5顺序表按下标查找

		case 4:
		{
			int sub;
			printf("输入查找的下标:");
			scanf("%d",&sub);
			find_sub(list,sub);
			puts("");
		}break;

------------------------------------
//按下标查找
int find_sub(seqlist *list,int sub)
{
 	//判断顺序表是否创建成功
	//判断顺序表是否空
	//判断下标是否在范围内
	if(list==NULL||empty(list)||sub<0||sub>=list->len)
	{
		printf("查找失败\n");
		return -1;
	}
	//查找,输出
	printf("查找的元素是:%d\n",list->date[sub]);
	return 0;
}

2.6顺序表按下标修改

		case 5:
		{
			int sub;int e;
			printf("输出修改的下标:");
			scanf("%d",&sub);
			printf("输入修改后的值:");
			scanf("%d",&e);
			revise_sub(list,sub,e);
			puts("");
		}break;

-----------------------------------------------
//按下标修改
int revise_sub(seqlist *list,int sub,int e)
{
	if(list==NULL||empty(list)||sub<0||sub>=list->len)
	{
		printf("修改失败\n");
	}
	list->date[sub]=e;
	printf("修改成功并且元素是:%d\n",list->date[sub]);//也可以不用输出,执行一下3,可以看效果
	return 0;
}

2.7顺序表按下标插入

		case 6:
		{
			int sub;int e;
			printf("输入插入的下标:");
			scanf("%d",&sub);
			printf("输入插入的值:");
			scanf("%d",&e);
			input_sub(list,sub,e);
			puts("");
		}break;

---------------------------------------------------------
//按下标插入
//比如插队,后面的人全部向后移动
//顺序插入,可以插中间,也可以插最后一个元素后面,也就是len后面
//因此判断合法的时候,下标可以等于len
int input_sub(seqlist *list,int sub,int e)
{		
	//判断顺序表是否创建成功
	//判断顺序表是否满
	//判断下标是否在范围内
	if(list==NULL||full(list)||sub<0||sub>list->len)
	{
		printf("插入失败\n");
		return -1;
	}
	for(int i=list->len-1;i>=sub;i--)
	{
		list->date[i+1]=list->date[i];
	}
	list->date[sub]=e;
	list->len++;
	printf("插入成功\n");//结果可以遍历3
	return 0;
}

2.8顺序表按下标删除

		case 7:
		{
			int sub;
			printf("输入删除的下标:");
			scanf("%d",&sub);
			delete_sub(list,sub);
			puts("");
		}break;

----------------------------------
//按下标删除
int delete_sub(seqlist *list,int sub)
{
	//判断顺序表是否创建成功
	//判断顺序表是否空
	//判断下标是否在范围内
	if(list==NULL||empty(list)||sub<0||sub>=list->len)
	{
		printf("删除失败\n");
		return -1;
	}
	for(int i=sub+1;i<list->len;i++)
	{
		list->date[i-1]=list->date[i];
	}	
	list->len--;
	printf("删除成功\n");
	return 0;
}
	

2.9按元素查找返回下标

		case 8:
		{
   			int key;
			printf("输入查找的值:");
			scanf("%d",&key);
			int sub=find_date(list,key);
			printf("查找值的下标=%d\n",sub);
			puts("");
		}break;

--------------------------------------------------------
//按元素查找返回下标
int find_date(seqlist *list,int key)//也就是比较
{	//判断顺序表是否创建成功
	//判断顺序表是否空
	if(list==NULL||empty(list))	//根据key找下标
	{
		printf("查找失败:");
		return -1;
	}
	for(int i=0;i<list->len;i++)//循环遍历
	{
		if(list->date[i]==key)
		{
			return i;//返回下标,主函数也要接
		}
	}
	return -1;//如果都查找了还是没有,就返回-1
}

2.10按元素删除

		case 9:
		{
			int key;
			printf("输入要删除的元素:");
			scanf("%d",&key);
			delete_date(list,key);
			puts("");
		}break;

-------------------------------------
//按元素删除,
int delete_date(seqlist *list,int key)
{   //这里没有写判断空,因为下面这行代码就已经调用find_date已经判断了
	int sub=find_date(list,key);
	//这里的下标返回可能是-1,可能是正确的
	//因此需要一个判断,看看是否找到这个元素
	if(sub==-1)
	{
		return -1;
	}
	delete_sub(list,sub);
	return 0;
}

 

2.11按元素修改

		case 10:
		{
			int key;int e;
			printf("输入要修改的元素:");
			scanf("%d",&key);
			printf("输入要修改为:");
			scanf("%d",&e);
			revise_date(list,key,e);
			puts("");
		}break;

--------------------------------------------
//按元素修改
int revise_date(seqlist *list,int key,int e)
{
	int sub=find_date(list,key);
	if(sub==-1)
	{
		return -1;
	}
	list->date[sub]=e;
	return 0;
}

2.12按元素插入

		case 11:
		{
			int key;int e;
			printf("输入要插入那个元素:");
			scanf("%d",&key);
			printf("输入要插入的元素是:");
			scanf("%d",&e);
			input_date(list,key,e);
			puts("");
		}break;

-------------------------------------------------
//按元素插入
int input_date(seqlist *list,int key,int e)
{//调用按元素查找返回下标
	int sub=find_date(list,key);
	if(sub==-1||sub<0||sub>list->len)
	{
		return -1;
	}
	for(int i=list->len-1;i>sub;i--)
	{
		list->date[i+1]=list->date[i];
	}
	list->date[sub+1]=e;
	list->len++;
	return 0;
}

2.13顺序表排序

		case 12:
		{
			printf("排序成功");
			sort(list);
			puts("");
		}break;

-------------------------------------
//顺序表排序
int sort(seqlist *list)
{
	if(list==NULL||empty(list))
	{
		return -1;
	}
	for(int i=1;i<list->len;i++)
	{
		for(int j=0;j<list->len-i;j++)
		{
			if(list->date[j]<list->date[j+1])
			{
				int temp=list->date[j];
				list->date[j]=list->date[j+1];
				list->date[j+1]=temp;
			}
		}
	}
	return 0;
}

 

2.14释放空间

		case 15:
		{
			list=free_space(list);
			printf("空间释放成功\n");
			puts("");
		}break;

--------------------------------------
//释放空间
seqlist *free_space(seqlist *list)
{
	if(list==NULL)
	{
		return NULL;
	}
	free(list);
	list=NULL;
	return list;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值