用数据结构中顺序表实现一组数据的存储,并通过简单的交互实现该顺序表的增删改查。
//ADT 线性表(List) 顺序存储结构
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType; //ElemTYpe类型根据实际情况而定。
typedef int Status; //Status是函数的返回值类型,其值是函数结果状态代码,如OK等。
//定义一个顺序表
typedef struct
{
ElemType data[MAXSIZE];
int length;
} SqList;
//顺序表的初始化
Status InitList(SqList *L)
{
L->length = 0;
return OK;
}
//判断顺序表是否初始化成功
Status ListEmpty(SqList L)
{
if (L.length == 0)
return TRUE;
else
return FALSE;
}
//将顺序表清空
Status ClearList(SqList *L)
{
L->length = 0;
return OK;
}
//查询顺序表的数据元素个数
Status ListLength(SqList L)
{
return L.length;
}
//关于顺序表的增删改查操作
//顺序表的取值,用*e将顺序表i位置的数据元素的值取出。
Status GetElem(SqList L, int i, ElemType *e)
{
if (L.length == 0 || i < 1 || i > L.length)
return ERROR;
*e = L.data[i - 1];
return OK;
}
//顺序表的查询,查询顺序表中数据元素的值为e的位置i。
Status LocateElem(SqList L, int i, int e)
{
if (L.length == 0)
return FALSE;
for (i = 0; i < L.length; i++)
{
if (L.data[i] == e)
{
i = i + 1;
break;
}
if (i >= L.length)
return ERROR;
}
return i;
}
//顺序表的插入,将值为e的数据元素插入位置i之前。
Status ListInsert(SqList *L, int i, int e)
{
int k;
if (L->length == MAXSIZE)
return FALSE;
if (i < 1 || i > L->length + 1)
return ERROR;
if (i <= L->length)
{
for (k = L->length - 1; k >= i - 1; k--)
{
L->data[k + 1] = L->data[k];
}
}
L->data[i - 1] = e;
L->length++;
return OK;
}
//顺序表的删除,将顺序表位置为i的数据元素删除,并用*e返回其值。
Status ListDelete(SqList *L, int i, ElemType *e)
{
int k;
if (L->length == 0)
return FALSE;
if (i < 1 || i > L->length)
return ERROR;
*e = L->data[i - 1];
if (i < L->length)
{
for (k = i; k < L->length; k++)
{
L->data[k - 1] = L->data[k];
}
}
L->length--;
return OK;
}
//顺序表主函数
int main()
{
SqList L;
ElemType e;
Status i;
printf("顺序表自动初始化中......\n");
i = InitList(&L); //初始化顺序表
i = ListEmpty(L); //判断顺序表是否初始化成功
if (i == 1)
printf("顺序表初始化成功,顺序表长度为%d\n", L.length); //输出初始化结果
else
printf("顺序表初始化失败\n");
printf("请输入整型数据:");
for (i = 0; TRUE; i++)
{
scanf("%d", &L.data[i]);
L.length++;
char c = getchar(); //通过getchar函数读取输入缓冲区的空格和回车,实现输入回车时结束数据的输入。
if (c == '\n')
break;
}
printf("数据存储成功,顺序表长度为%d\n", L.length);
while (TRUE) //该循环意在实现交互性。
{
int a;
printf("请选择要进行的操作:\n1:查询顺序表数据元素个数\n2:取出相应位序数据元素的值\n3:查询数据元素的值的相应位置\n4:数据元素的插入\n5:数据元素的删除\n6:清空顺序表并结束程序\n");
scanf("%d", &a);
switch (a)
{
case 1:
{
int b;
b = ListLength(L);
printf("顺序表数据元素个数为%d\n", b);
break;
}
case 2:
{
int b;
printf("请输入将要取值的位序:");
scanf("%d", &i);
b = GetElem(L, i, &e);
if (b == 0)
printf("将要取值的位序不正确\n");
else
printf("取值成功,值为%d\n", e);
break;
}
case 3:
{
int b;
printf("请输入将要查询的值:");
scanf("%d", &e);
b = LocateElem(L, i, e);
if (b == 0)
printf("将要查询的值不在顺序表中\n");
else
printf("查询成功,位序为:%d\n", b);
break;
}
case 4:
{
int b;
printf("请输入将要插入的值:");
scanf("%d", &e);
printf("请输入将要插入的位序:");
scanf("%d", &i);
b = ListInsert(&L, i, e);
if (b == 0)
printf("插入失败\n");
else
printf("插入成功\n");
break;
}
case 5:
{
int b;
printf("请输入将要删除的位序:\n");
scanf("%d", &i);
b = ListDelete(&L, i, &e);
if (b == 0)
printf("删除失败\n");
else
printf("删除成功,删除的值为%d\n", e);
break;
}
case 6:
{
int b;
b = ClearList(&L);
if (b == 0)
printf("顺序表清空失败\n");
else
printf("顺序表清空成功\n");
exit(0);
}
default:
break;
}
}
return 0;
}