目录
一、顺序表相关函数声明(before.h)
#ifndef _BEFORE_H
#define _BEFORE_H
typedef int ElemType;
typedef int status;
#define InitSize 10000
#define OK 1
#define ERR 0
#define OVERFLOW (-1)
typedef int ElemType;
typedef int status;
typedef struct {
ElemType *data; //指示动态分配数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表的当前长度
}SqList;//顺序表的类型定义动态分配的方式
//顺序表的函数声明
status InitList(SqList &L); //建立空的顺序表
status ListEmpty(SqList L); //判断顺序表是否为空
status ListLength(SqList L); //求顺序表的长度
status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e); //查找直接前驱
status NextElem(SqList L,ElemType cur_e,ElemType &next_e); //查找直接后继
status GetElem(SqList L,int i); //查找第i位元素值
status LocateElem(SqList L,int e); //查找某元素值位序
status ListTraverse(SqList &L); //逆置顺序表
status ClearList(SqList &L); //清空顺序表
status DestroyList(SqList &L); //销毁顺序表
status CreatElem(SqList &L); //创建顺序表
status ListInsert(SqList &L,int i,int e); //插入元素
status ListDelete(SqList &L,int i,int &e); //删除元素
void PrintList(SqList L); //输出顺序表所有元素
//菜单调用函数声明
void Menu_SqList();
#endif
//
//Created by somewon on 2022/9/29.
//
二、顺序表功能函数定义(func.cpp)
#include <iostream>
#include "before.h"
using namespace std;
//顺序表的相关函数定义
status InitList(SqList &L)
{
//用malloc申请连续的内存空间
L.data = (ElemType *)malloc(sizeof(ElemType)*InitSize);
L.length = 0; //顺序表初始长度为0
L.MaxSize = InitSize;
return OK;
}//建立一个空表
status ListEmpty(SqList L)
{
if(L.length == 0) return OK;
else return ERR;
}//判断顺序表是否为空
status ListLength(SqList L)
{
return (L.length);
}
status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e)
{
int j = LocateElem(L,cur_e); //返回cur_e值的位序
if(j!=ERR && j>2)
{
pre_e = L.data[j-2];
return OK;
}
else if(j == ERR) return OVERFLOW; //不在顺序表中
else if(j == 1) return ERR; //首位无直接前驱
}
status NextElem(SqList L,ElemType cur_e,ElemType &next_e)
{
int j = LocateElem(L,cur_e);
if(j!=ERR && j<L.length)
{
next_e = L.data[j];
return OK;
}
else if(j == ERR) return OVERFLOW; //不在顺序表中
else if(j == L.length) return ERR; //末位无直接后继
}
status GetElem(SqList L,int i)
{
if(i<=L.length) return L.data[i-1];
else return ERR;
}//动静态存储是一样的
status LocateElem(SqList L,int e)
{
for(int i = 0;i < L.length;i ++)
if(L.data[i] == e) return i+1;
return ERR;
}
status ListTraverse(SqList &L)
{
int i,temp;
for(i = 0;i < L.length/2;i ++)
{
temp = L.data[i];
L.data[i] = L.data[L.length-1-i];
L.data[L.length-1-i] = temp;
}
return OK;
}//逆置顺序表
status ClearList(SqList &L)
{
L.length = 0;
return OK;
}//清空顺序表(只是无法访问而已,数据还在)
status DestroyList(SqList &L)
{
delete[] L.data;
return OK;
}//释放顺序表的空间(已经无法访问,数据不在)
status CreatElem(SqList &L)
{
int cnt = 0;
ElemType x;
cin >> x;
while(x != -1)
{
L.data[cnt] = x;
cnt ++;
cin >> x;
}
L.length = cnt;
return OK;
}//创建顺序表
status ListInsert(SqList &L,int i,int e)
{
if(i<1 || i>L.length+1) return ERR; //判断i是否合理
if(L.length >= L.MaxSize) return ERR; //当前存储空间已满,不能插入
for(int j = L.length;j >= i;j --) L.data[j] = L.data[j-1]; //将第i个元素及之后的元素后移
L.data[i-1] = e;
L.length ++;
return OK;
}//在第i位置上插入元素e
status ListDelete(SqList &L,int i,int &e)
{
if(i<1 || i>L.length) return ERR; //判断i值是否合理
e = L.data[i-1]; //将删除的值赋给e
for(int j = i;j < L.length;j ++)
L.data[j-1] = L.data[j];
L.length --; //长度减少一
return OK;
}//删除第i个元素
void PrintList(SqList L)
{
if(L.length == 0) printf("该表目前为空表!\n");
else
{
printf("--当前顺序表中的元素为:\n");
int numb = 0;
for(int i = 0;i < L.length;i ++)
{
printf("%d\t",L.data[i]);
numb ++;
if(numb%7 == 0) printf("\n");
}
printf("\n");
}
}//打印顺序表
//菜单定义
void Menu_SqList()
{
printf("\t\t\t************************以下为顺序表的菜单*******************************\n");
printf("\t\t\t\t1、建立空表 2、创建顺序表 \n");
printf("\t\t\t\t3、判断顺序表是否为空 4、查看顺序表的长度 \n");
printf("\t\t\t\t5、查看某元素的直接前驱 6、查看某元素的直接后继 \n");
printf("\t\t\t\t7、查看某位置的数据元素 8、查看某元素的对应位置 \n");
printf("\t\t\t\t9、将顺序表逆置 10、清空顺序表 \n");
printf("\t\t\t\t11、销毁顺序表 12、插入元素 \n");
printf("\t\t\t\t13、删除元素 14、输出顺序表所有元素 \n");
printf("\t\t\t\t15、退出操作系统 \n");
printf("\t\t\tTips:只有进行完1、2操作之后才能进行后续操作,否则程序出现崩溃! \n");
printf("\t\t\t*************************************************************************\n");
}
//
//Created by somewon on 2022/9/29.
//
三、顺序表主调函数(main.cpp)
#include <iostream>
#include "before.h"
using namespace std;
int main() {
SqList L;
ElemType cur_e,cur_ee,pre_e,next_e,e;
int order,choice,fine;
do{
Menu_SqList(); //打印对应函数说明菜单
printf("请输入你的选择: ");
cin >> choice;
switch(choice)
{
case 1:
if(InitList(L) == OK) printf("空表建立成功!\n");
else printf("空表建立失败!请再次尝试!\n");
break;
case 2:
printf("请输入顺序表中的元素,直至-1停止:\n");
if(CreatElem(L) == OK)
{
printf("创建顺序表成功!\n");
PrintList(L);
}
else printf("创建顺序表失败!\n");
break;
case 3:
if(ListEmpty(L) == OK) printf("该表为空表!\n");
else printf("该表不为空!\n");
break;
case 4:
printf("该表的长度为%d!\n",ListLength(L));
break;
case 5:
printf("请输入需要查询直接前驱的元素值: ");
cin >> cur_e;
pre_e = -1;
fine = PriorElem(L,cur_e,pre_e);
if(fine == OK) printf("该元素的直接前驱为:%d\n",pre_e);
else if(fine == ERR)printf("该元素无直接前驱!\n");
else printf("该元素不在顺序表中!\n");
break;
case 6:
printf("请输入需要查询直接后继的元素值: ");
cin >> cur_ee;
next_e = -1;
fine = NextElem(L,cur_ee,next_e);
if(fine == OK) printf("该元素的直接后继为:%d\n",next_e);
else if(fine == ERR) printf("该元素无直接后继!\n");
else printf("该元素不在顺序表中!\n");
break;
case 7:
printf("请输入需要查询的位置: ");
cin >> order;
e = GetElem(L,order);
if(e == ERR) printf("该位序不合理!\n");
else printf("该位置的元素值为:%d\n",e);
break;
case 8:
printf("请输入需要查看的元素:");
cin >> e;
if(LocateElem(L,e) != ERR) printf("该元素所在位置为:%d\n",LocateElem(L,e));
else printf("该元素不在顺序表中!\n");
break;
case 9:
if(ListTraverse(L) == OK)
{
printf("顺序表逆置成功!\n");
PrintList(L);
}
else printf("该表逆置失败,请再次尝试!\n");
break;
case 10:
if(ClearList(L) == OK) printf("该表清空成功!\n");
else printf("清空顺序表失败,请再次尝试操作!\n");
break;
case 11:
if(DestroyList(L) == OK) printf("该顺序表销毁成功!\n");
else printf("销毁失败,请再次进行操作!\n");
break;
case 12:
printf("请输入需要插入的元素值:");
cin >> e;
printf("请输入该元素插入的位序:");
cin >> order;
if(ListInsert(L,order,e) == OK)
{
printf("该位置元素插入成功!\n");
PrintList(L);
}
else printf("请检查插入位置或元素类型,再次进行操作!\n");
break;
case 13:
printf("请输入需要删除的元素位序:");
cin >> order;
if(ListDelete(L,order,e) == OK)
{
printf("该位序上的元素删除成功,被删除的元素值为:%d\n",e);
PrintList(L);
}
else printf("请检查需要删除的位序是否合理,删除失败!\n");
break;
case 14:
PrintList(L);
break;
case 15:
goto END;
default:
printf("无该操作,请再次进行选择!\n");
}
}while(choice);
END:
printf("谢谢您的使用!欢迎下次光临嘿哈!\n");
return 0;
}
//
// Created by somewon on 2022/9/29.
//
四、运行环境
CLion