#define _CRT_SECURE_NO_WARNINGS//关闭vs中使用scanf报错
#include <iostream>
#define MAXSIZE 50
typedef struct {
int data[MAXSIZE];
int length;
}SqList;
void InitList(SqList& L);//初始化静态分配空间的线性表并赋值
int LocateElem(SqList L, int e);//查找对应元素的位置
bool ListDelete(SqList& L, int i, int& e);//删除某个位置元素
bool ListInsert(SqList& L, int i, int e);//在某个位置插入元素
void menu();//打印菜单
void printElem(SqList L);//打印当前线性表元素
int main()
{
//创建一个SqList顺序表变量
SqList sqlist;
int input = 0;//使用input控制do-while循环和switch语句
do {
menu();
scanf("%d", &input);
switch (input) {
//注:在case语句中初始化变量需要加上{}使其成为独立的代码块,其内定义的变量为块内局部变量,若在case语句内初始化变量或者定义并初始化变量违背语法规则,跳过了变量的初始化,会报错
case 1: {
printf("请输入元素值,输入一个按一次空格,输入EOF代表输入结束\n");
int index = 0;
int e = 0;
InitList(sqlist);
break;
}
case 2:
{
int index = 0;
int e = 0;
printf("请输入要插入的位置");
scanf("%d", &index);
printf("请输入要插入的元素值");
scanf("%d", &e);
if (ListInsert(sqlist, index, e)) {
printf("插入成功");
}
else {
printf("插入失败");
}
break;
}
case 3:
{
int index = 0;
int e = 0;
printf("请输入要删除的元素位置");
scanf("%d", &index);
if (ListDelete(sqlist, index, e)) {
printf("删除%d成功", e);
}
else {
printf("删除失败");
}
break;
}
case 4:
{
int index = 0;
int e = 0;
printf("请输入要查找的元素值");
scanf("%d", &e);
printf("位置为%d", LocateElem(sqlist, e));
break;
}
case 5:
printElem(sqlist);
break;
default:
break;
}
} while (input);
}
void InitList(SqList& L) {
//初始化静态分配线性表的数据值
for (int i = 0; i < MAXSIZE; i++) {
L.data[i] = 0;
}
//初始长度赋值为0
L.length = 0;
int n = 0;
int i = 0;
while (scanf("%d", &n) != EOF) {
if (L.length <= MAXSIZE) {
L.data[i++] = n;
L.length++;
}
}
printf("初始化并赋值完成,初始信息如下");
printf("初值:\n");
for (int i = 0; i < L.length; i++) {
printf("%d\t", L.data[i]);
}
printf("长度:%d", L.length);
}
bool ListInsert(SqList& L, int i, int e) {
if (i<1 || i>L.length + 1) {
return false;
}
if (L.length >= MAXSIZE) {
return false;
}
for (int j = L.length; j >= i; j--) {
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
return true;
}
bool ListDelete(SqList& L, int i, int& e) {
if (i<1 || i>L.length) {
return false;
}
e = L.data[i - 1];
//j只能小于L.length,不能等于L.length,如果等于的话会读取到第L.length+1位置上的脏数据
for (int j = i; j <= L.length; j++) {
L.data[j - 1] = L.data[j];
}
L.length--;
return true;
}
int LocateElem(SqList L, int e) {
for (int i = 0; i < L.length; i++) {
if (L.data[i] == e) {
return i + 1;//返回位序i+1
}
}
return 0;
}
//打印线性表当前信息
void printElem(SqList L) {
if (L.length > 0) {
printf("元素:\n");
for (int i = 0; i < L.length; i++) {
printf("%d\t", L.data[i]);
}
}
printf("长度:%d", L.length);
}
void menu() {
printf("\n1.初始化一个静态分配线性表并赋值\n"
"2.在线性表第i个位置插入元素\n"
"3.删除线性表第i个元素\n"
"4.按值查找(相同值只返回第一个元素位置)\n"
"5.打印线性表当前信息\n"
"0.退出\n"
);
}
注:在case语句中初始化变量需要加上{}使其成为独立的代码块,其内定义的变量为块内局部变量,若在case语句内初始化变量或者定义并初始化变量违背语法规则,跳过了变量的初始化,会报错