#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#define MaxSize 100//定义顺序表最大长度
#define ElemType int//把int命名为ElemType
typedef struct
{
ElemType data[MaxSize];//顺序表元素
int length; //顺序表当前长度
}SqList;
int InitList(SqList& L)
{
memset(L.data, 0, sizeof(L));//初始化数据为0
L.length = 0; //初始化长度为0
return 0;
}
bool CreateList(SqList& L, int n) //创建顺序表函数 初始化前n个数据
{
printf("初始化顺序表,请输入顺序表的元素:\n");
if (n<0 || n>MaxSize)
false;
for (int i = 0; i < n; i++)
{
scanf_s("%d", &L.data[i]);
L.length++;
}
return true;
}
bool InsertList(SqList& L, int i, ElemType e)
{
if (i<1 || i>L.length + 1) //判断位置是否有效
{
printf("位置无效!!!\n");
return false;
}
if (L.length >= MaxSize)//判断存储空间是否已满
{
printf("当前存储空间已满!!!\n");
return false;
}
for (int j = L.length; j >= i; j--)//位置i及之后元素后移
{
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
return true;
}
bool DeleteLest_i(SqList& L, int i) //按位置删除元素
{
if (i<1 && i>L.length) //判断i是否合法
return false;
else
{
for (int j = i; j < L.length; j++)
{
L.data[j - 1] = L.data[j]; //删除元素后面的所有元素前移一个单位
}
L.length--; //长度减一
return true;
}
}
void DeleteList_x(SqList& L, ElemType x) //按值删除元素
{
int count = 0, i = 0;//count记录元素x的值有几个
while (i < L.length)
{
if (x == L.data[i])
count++;
else
L.data[i - count] = L.data[i];//元素前移count个单位
i++;
}
if (count == 0) //没有该值时
printf("没有该值!\n\n");
L.length = L.length - count; //总长减count
}
void ReverseList(SqList& L)//元素逆置,空间复杂度为O(1)
{
ElemType temp;
for (int i = 0; i < L.length / 2; i++)
{
temp = L.data[i];
L.data[i] = L.data[L.length - i - 1];
L.data[L.length - i - 1] = temp;
}
}
void Print(SqList L)//打印元素的值
{
printf("打印顺序表的值:");
for (int i = 0; i <L.length; i++)
{
printf("%d ", L.data[i]);
}
printf("\n");
}
int main() //主函数
{
SqList L;
while (1)
{
printf("\n请输入接下来的操作:\n");
printf("1:初始化顺序表,并输入初始值:\n");
printf("2:插入元素:\n");
printf("3:打印元素:\n");
printf("4:按位置删除元素:\n");
printf("5:按值删除元素:\n");
printf("6:元素逆置:\n");
printf("-1:退出:\n");
printf("\n\n");
int n = 0, i = 0, e = 0;
int x, in = 0, elem = 0;
scanf_s("%d",&x);
if (x == -1)
break;
switch (x)
{
case 1://初始化
InitList(L);
printf("请输入顺序表的长度:");
scanf_s("%d", &n);
CreateList(L, n);
printf("\n");
break;
case 2:
printf("\n输入插入的位置和元素:");
scanf_s("%d%d", &i, &e);
InsertList(L, i, e);
break;
case 3:
Print(L);
break;
case 4:
printf("请输入删除的位置:");
scanf_s("%d", &in);
DeleteLest_i(L, in);
break;
case 5:
printf("请您输入要删除的元素的值:");
scanf_s("%d", &elem);
DeleteList_x(L, elem);
break;
case 6:
ReverseList(L);
break;
}
}
return 0;
}
运行结果: