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