编译器———VS2019
#include "head.h"
#pragma once
#define _CRT_SECURE_NO_WARNINGS//防止scanf会报警
//*************************顺序表的实现---静态分配*******************************
//*************************相关头文件的声明*************************************
#include <stdio.h>
//*************************相关常、变量的定义、初始化*****************************
#define MAXSIZE 6//定义顺表的最大长度
int i = 0;//操作位序
int e = -1;//定义操作元素e的值为-1
int result = 0;//顺序表操作实现后的结果
int operation = 0;//定义相关操作数,便于顺序表的操作
//*************************函数结果状态代码*************************
//C++写的,我只用到了true和false
typedef int Status;//Status是函数返回值类型,其值是函数结果状态代码
typedef int ElemType;//数据元素约定为ElemType,用户在使用该数据类型时自行定义,此处定义为int
//顺序表结构的定义
typedef struct sequencelist
{
ElemType data[MAXSIZE];//用静态的数组存放数据元素
int length;//顺序表的当前长度
}SequenceList;//顺序表的类型定义(静态分配方式)
//顺序表相关操作的声明
void Menu();//菜单栏的展示
void InitList(SequenceList* L);//基本操作---初始化一个顺序表
Status ListInsert(SequenceList* L, int i, int e);//基本操作---向表中添加元素
Status ListDeleteOne(SequenceList* L, int i, int& e);//基本操作---删除表中第i个位置的元素
Status ListDeleteTwo(SequenceList& L, int &i, int e);//按照位序删除
Status UpdateElemOne(SequenceList& L, int i, int e);//按照位序更改
Status UpdateElemTwo(SequenceList& L, int i, int e);//按照元素值更改
Status LocateElem(SequenceList& L, int& i, int e);//定位元素的位序
Status GetElem(SequenceList& L, int i, int& e);//按照位序取元素值
Status ListLength(SequenceList& L);//获取顺序表的长度
void TraverseList(SequenceList& L);//顺序表的遍历
void ClearList(SequenceList& L);//顺序表的清空
#include "function.h"
#pragma once
//菜单栏
void Menu()
{
printf("****************************************************************************\n");
printf(" 1.增 2.删 3.改 4.查\n\n 5.获长 6.遍历 7.置空 8.退出\n");
printf("****************************************************************************\n");
}
//顺序表相关操作的定义
void InitList(SequenceList* L)//基本操作---初始化一个顺序表
{
for (int i = 0; i < MAXSIZE; i++)
{
L->data[i] = 0;//将所有数据元素设置为默认初始值,倘若没有设置数据元素的默认值,内存中会有遗留的“脏数据”
}
L->length = 0;//顺序表初始化长度为0
}
Status ListInsert(SequenceList* L, int i, int e)//基本操作---顺序表的插入操作,在L的位序i处插入元素e
{
if (i<1 || i>L->length + 1)//判断i的范围是否有效
{
printf("\n当前插入位序不合理,插入无效!\n");
return false;
}
if (L->length >= MAXSIZE)//当前存储空间已满,不能插入
{
printf("\n当前存储空间已满,不能插入!\n");
return false;
}
for (int j = L->length; j >= i; j--)//将第i个元素及之后的元素后移
{
L->data[j] = L->data[j - 1];//注意位序、数组下标的关系,并从后面的元素依次移动
}
L->data[i - 1] = e;//在位置i处放入e
L->length++;//长度加1
return true;
}
Status ListDeleteOne(SequenceList* L, int i, int& e)//基本操作---删除表中第i个位置的元素
{
if (i<1 || i>L->length)//判断i的范围是否有效
{
printf("\n当前待删位序不合理,删除无效!\n");
return false;
}
e = L->data[i - 1];//将被删除的元素赋值给e
for (int j = i; j < L->length; j++)//将第i个位置后的元素前移
{
L->data[j - 1] = L->data[j];
}
L->length--;//线性表表长减1
return true;
}
Status ListDeleteTwo(SequenceList& L, int &i, int e)//按元素值删除
{
for (int j = 0; j < L.length; j++)
{
if (L.data[j] == e)
{
i = j + 1;//数组下标为j的元素值等于e,其位序i+1
for (int k = i; k < L.length; k++)//将第i个位置后的元素前移
{
L.data[k - 1] = L.data[k];
}
L.length--;//线性表表长减1
return true;
}
}
printf("\n该元素不存在!\n");
return false;
}
Status UpdateElemOne(SequenceList& L, int i, int e)//按下标改
{
if (i<1 || i>L.length)//判断i的范围是否有效
{
printf("\n当前更改位序不合理,更改无效!\n");
return false;
}
L.data[i - 1] = e;
return true;
}
Status UpdateElemTwo(SequenceList& L, int i, int e)//按元素改
{
int new_e = 0;
for (int j = 0; j < L.length; j++)
{
if (L.data[j] == e)
{
printf("\n请输入更改后的元素值————"); scanf("%d", &new_e);
L.data[j] = new_e;
return true;
}
}
printf("\n该元素值不存在!\n");
return false;
}
Status LocateElem(SequenceList& L, int& i, int e)
{
for (int j = 0; j < L.length; j++)
{
if (L.data[j] == e)
{
i = j + 1;//数组下标为j的元素值等于e,返回其位序i+1
return true;
}
}
return false;//退出循环,说明查找失败
}
Status GetElem(SequenceList& L, int i, int& e)
{
if (i<1 || i>L.length)//判断i的范围是否有效
{
printf("\n当前查找位序不合理,查找无效!\n\n");
return false;
}
else
{
e = L.data[i - 1];
return true;
}
}
Status ListLength(SequenceList& L)
{
return L.length;
}
void TraverseList(SequenceList& L)
{
if (L.length)
{
for (int i = 0; i < L.length; i++)
{
printf("%d ", L.data[i]);
}
printf("\n\n");
}
else
{
printf("\n空表!\n");
}
}
void ClearList(SequenceList& L)
{
if (L.length)
{
for (int i = 0; i < MAXSIZE; i++)
{
L.data[i] = 0;
}
L.length = 0;
printf("\n\n成功置空\n\n");
}
else
{
printf("\n当前顺序表已是置空状态,无需置空!\n");
}
}
C++.cpp
#include "head.h"
#include "function.h"
//主函数的入口
int main()
{
Menu();//菜单栏的输出
SequenceList L;//声明一个顺序表,在内存中分配存储顺序表L的空间,包括MAXSIZE*sizeof(ElemType)和存储length的空间
InitList(&L);//初始化顺序表
while (true)
{
printf("请选择相关操作数————"); scanf("%d", &operation);
switch (operation)
{
case 1:
printf("\n\n********************###您当前正在进行顺序表的插入操作###********************\n");
printf("请输入待插入的位序————"); scanf("%d", &i);
printf("\n");
printf("请输入待插入的元素————"); scanf("%d", &e);
result = ListInsert(&L, i, e);
if (result)
{
printf("\n插入成功!\n\n");
}
else
{
printf("\n插入失败!\n\n");
}
break;
case 2:
printf("\n********************###您当前正在进行顺序表的删除操作###********************\n");
printf("\n*************************************\n");
printf("\n1.按位序进行删除\n\n2.按给定的元素值进行删除\n\n3.退出删除操作\n");
printf("\n\n*************************************\n");
while (true)
{
printf("请选择相关操作数(当前处于删除状态)————"); scanf("%d", &operation);
if (operation == 1)
{
printf("\n**********###按位序进行删除###**********\n");
printf("请输入待删位序————"); scanf("%d", &i);
result = ListDeleteOne(&L, i, e);
if (result)
{
printf("\n删除成功,该位序所对应的元素为%d\n\n",e);
}
else
{
printf("\n删除失败!\n\n");
}
}
else if (operation == 2)
{
printf("\n**********###按元素值进行删除###**********\n\n");
printf("请输入待删元素值————"); scanf("%d", &e);
result = ListDeleteTwo(L, i, e);
if (result)
{
printf("\n删除成功,待删元素所对应的位序为%d\n\n",i);
}
else
{
printf("\n删除失败!\n\n");
}
}
else if (operation == 3)
{
printf("\n成功退出顺序表的删除操作!\n\n");
break;
}
else
{
printf("\n当前所输入的操作数无效,请按照指定的操作数进行输入!\n\n");
}
}
break;
case 3:
printf("\n******************###您当前正在进行顺序表的更改操作###******************\n");
printf("\n*************************************\n");
printf("\n1.按位序进行更改\n\n2.按给定的元素值进行更改\n\n3.退出更改操作\n");
printf("\n*************************************\n");
while (true)
{
printf("请选择相关操作数(当前处于更改状态)————"); scanf("%d", &operation);
if (operation == 1)
{
printf("\n**********###按位序进行更改###**********\n");
printf("请输入待改位序————"); scanf("%d", &i);
printf("请输入更新后的数值————"); scanf("%d", &e);
result = UpdateElemOne(L, i, e);
if (result)
{
printf("\n更改成功!\n\n");
}
else
{
printf("\n更改失败!\n\n");
}
}
else if (operation == 2)
{
printf("请输入待改元素值————"); scanf("%d", &e);
result = UpdateElemTwo(L, i, e);
if (result)
{
printf("\n更改成功\n\n");
}
else
{
printf("\n更改失败!\n\n");
}
}
else if (operation == 3)
{
printf("\n成功退出顺序表的更新操作!\n\n");
break;
}
else
{
printf("\n当前所输入的操作数无效,请按照指定的操作数进行输入!\n");
}
}
break;
case 4:
printf("\n******************###您当前正在进行顺序表的查找操作###******************\n");
printf("\n*************************************\n");
printf("\n1.按位序进行查找\n\n2.按给定的元素值进行查找\n\n3.退出查找操作\n");
printf("\n*************************************\n");
while (true)
{
printf("请选择相关操作数(当前处于查找状态)————"); scanf("%d", &operation);
if (operation == 1)
{
printf("\n**********###按位序进行查找###**********\n");
printf("\n请输入待查位序————"); scanf("%d", &i);
result = GetElem(L, i, e);
if (result)
{
printf("\n查找成功,该位序所对应的元素值为%d\n\n", e);
}
else
{
printf("\n查找失败!\n\n");
}
}
else if (operation == 2)
{
printf("请输入待查元素值————"); scanf("%d", &e);
result = LocateElem(L, i, e);
if (result)
{
printf("\n查找成功,该元素所对应的位序为%d\n\n", i);
}
else
{
printf("\n查找失败!\n\n");
}
}
else if (operation == 3)
{
printf("\n成功退出顺序表的查找操作!\n\n");
break;
}
else
{
printf("\n当前所输入的操作数无效,请按照指定的操作数进行输入!\n\n");
}
}
break;
case 5:
printf("\n******************###您当前正在进行顺序表的获长操作###******************\n");
result = ListLength(L);
printf("当前顺序表的长度为————%d\n\n", result);
break;
case 6:
printf("\n******************###您当前正在进行顺序表的遍历操作###******************\n");
TraverseList(L);
break;
case 7:
printf("\n******************###您当前正在进行顺序表的置空操作###******************\n");
ClearList(L);
break;
case 8:
printf("\n成功退出程序!\n");
return 0;
default:
printf("当前所输入的操作数无效,请按照指定的操作数进行输入!\n\n");
}
}
}
运行结果图