#include <iostream>
#include <stdlib.h>
using namespace std;
//通过数组实现线性表的顺序存储结构
//每次完成操作之后都会调用ShowList()
typedef struct
{
//定义一个顺序表的结构体,便于储存控件地址,长度和内存容量
int *data;
int length = 0;
int listsize = 0; //当前存储容量(以sizeof(ElemType)为单位
} List;
void ShowList(List &L)
{
//实验展示顺序表的方法,便于随时查看顺序表中的元素
printf("目前表中元素为:[");
for (int i = 0; i < L.length; i++)
{
printf("%d", L.data[i]);
if (i != L.length - 1)
printf(",");
}
printf("]\n");
}
void CreateList(List &L)
{
//构造构造一个顺序表
int n;
printf("请输入要创建的顺序表的长度:");
scanf("%d", &n);
L.data = (int *)malloc(n * sizeof(int));
printf("请输入表中各元素的值,以空格分开:");
for (int i = 0; i < n; i++)
{
scanf("%d", &L.data[i]);
}
L.length = n;
L.listsize = n;
ShowList(L);
}
void ListInsert(List &L)
{
//在顺序线性表 L 中第 i 个位置之前插入新元素 e
int i = 0, e;
do
{
printf("请输入要插入的位置:");
scanf("%d", &i);
if (i < 1 || i > L.length + 1)
printf("输入的位置不合法!\n");
} while (i < 1 || i > L.length + 1); // i的值要合法
printf("请输入要插入的元素:");
scanf("%d", &e);
if (L.length >= L.listsize)
{ //当前存储控件已满,增加分配
L.data = (int *)realloc(L.data, (L.listsize + 1) * sizeof(int));
L.listsize += 1; //增加内存容量
}
int *q = &(L.data[i - 1]); // q 为插入位置
for (int *p = &(L.data[L.length - 1]); p >= q; --p)
{
*(p + 1) = *p; //插入位置及之后的元素右移
}
*q = e; //插入e
++L.length; //表长增 1
ShowList(L);
}
int ListDelete(List &L)
{
//删除顺序表中的第 i 个元素的值,并返回这个值
int i, e;
do
{
printf("请输入要删除的元素在表中的位置:");
scanf("%d", &i);
if (i < 1 || i > L.length)
printf("输入的位置不合法!\n");
} while (i < 1 || i > L.length); // i的值不合法
e = (L.data[i - 1]);
for (int *p = &(L.data[i - 1]); p <= &(L.data[L.length - 2]); p++)
{
*p = *(p + 1); // i以后的元素位置整体左移
}
printf("删除的元素为%d\n", e);
L.length--;
if (L.length < L.listsize)
{
L.data = (int *)realloc(L.data, (L.listsize - 1) * sizeof(int));
L.listsize -= 1; //减少内存分配
}
ShowList(L);
return e;
}
int main()
{
int e;
List L;
CreateList(L);
ListInsert(L);
e = ListDelete(L);
return 0;
}