#include<stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int ElemType;
typedef struct {
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize;//当前分配的存储容量
}SqList;
//构造线性表
int InitList(SqList *L) {
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));//存储分配失败
if (!L->elem)
exit(OVERFLOW);//空表长度初始化为0;
L->length = 0;//存储的初始容量为初始分配空间
L->listsize = LIST_INIT_SIZE;
return OK;
}
//销毁线性表
int Desttroylist(SqList *L) {
free(L->elem);
L->elem = NULL;
L->length = 0;
L->listsize = 0;
return OK;
}
//重置线性表
int ClearList(SqList *L) {
free(L->elem);
L->elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!L->elem)
exit(OVERFLOW);
L->length = 0;
L->listsize = LIST_INIT_SIZE;
return OK;
}
//判断线性表是否为空
int EmptyList(SqList L) {
return L.length == 0 ? TRUE : FALSE;
}
//返回线性表的长度
int ListLength(SqList L) {
return L.length;
}
//返回第i个数据元素的值
int GetElem(SqList L, int i) {
if (i < 1 || i > L.length)
return ERROR;
return L.elem[i - 1];
}
//判断元素
int LocateElem(SqList L, ElemType e) {
for (int i = 0; i < L.length; i++) {
if (L.elem[i] == e)
return i + 1;
}
return ERROR;
}
//返回前驱
int PreElem(SqList L, int i) {
if (i <= 1 || i > L.length)
return ERROR;
return L.elem[i - 2];
}
//返回后继
int NextElem(SqList L, int i) {
if (i < 1 || i >= L.length)
return ERROR;
return L.elem[i];
}
//在前面插入新数据元素
int ListInsert(SqList *L, int i, ElemType e) {
if (i < 1 || i > L->length + 1)
return ERROR;
for (int j = L->length; j >= i; j--) {
L->elem[j] = L->elem[j - 1];
}
L->elem[i - 1] = e;
// 线性表长度加一
L->length++;
return OK;
}
//删除第i个数据元素
int ListDetele(SqList *L, int i) {
if (i < 1 || i > L->length)
return ERROR;
ElemType e = L->elem[i - 1];
for (int j = L->length - i; j > 0; j--) {
L->elem[L->length - j - 1] = L->elem[L->length - j];
}
L->length--;
return e;
}
//调用visit()
int ListTraverse(SqList L, void(*vi)(ElemType *))
{
ElemType *p;
int i;
p = L.elem;
for (i = 1; i <= L.length; i++)
vi(p++);
printf("\n");
return OK;
}
//打印
int ListPrint(SqList L) {
for (int i = 1; i <= L.length; i++) {
printf("%d ", GetElem(L, i));
}
return OK;
}
int main() {
SqList L;
printf("*********************************\n");
printf("******* 线 性 表 ******\n");
printf("******* 1. 创建一个线性表 ******\n");
printf("******* 2. 重置该表 ******\n");
printf("******* 3. 判断是否为空表 ******\n");
printf("******* 4. 返回元素个数 ******\n");
printf("******* 5. 返回指定数值 ******\n");
printf("******* 6. 判断元素 ******\n");
printf("******* 7. 返回前驱 ******\n");
printf("******* 8. 返回后继 ******\n");
printf("******* 9. 插入元素 ******\n");
printf("******* 10. 删除元素 ******\n");
printf("******* 11. 调用函数 ******\n");
printf("******* 12. 销毁线性表 ******\n");
printf("******* 13. 打印当前线性表 ******\n");
printf("*********************************\n\n");
printf("---------------------------------\n\n");
InitList(&L);
while(1){
int num1, placenum;
int datanum,numvalue;
printf("请输入对应指令:\n");
scanf_s("%d", &num1);
switch(num1)
{
case 1://创建线性表
printf("请输入元素个数:\n");
scanf_s("%d", &datanum);
printf("请输入线性表元素:\n");
for (int i = 1,a; i < datanum+1; i++) {
scanf_s("%d", &a);
ListInsert(&L,i,a);
}
printf("您输入的线性表:\n");
ListPrint(L);
printf("\n");
break;
case 2://重置
ClearList(&L);
break;
case 3://判断
printf("%d\n",EmptyList(L));
break;
case 4://返回元素个数
printf("元素个数:%d\n",ListLength(L));
break;
case 5://返回指定数值
printf("请输入位置:\n");
scanf_s("%d", &placenum);
printf("第%d个元素:%d\n",placenum,ListDetele(&L, placenum));
break;
case 6://判断元素
printf("请输入一个值:\n");
scanf_s("%d", &numvalue);
printf("第一个与%d值相等的位置:%d\n",numvalue,LocateElem(L, numvalue));
break;
case 7://返回前驱
printf("请输入位置:\n");
scanf_s("%d", &placenum);
printf("第%d个元素的前驱:%d\n",placenum,PreElem(L, placenum));
break;
case 8://返回后继
printf("请输入位置:\n");
scanf_s("%d", &placenum);
printf("第%d个元素的后继:%d\n",placenum,NextElem(L, placenum));
break;
case 9://插入元素
printf("请输入位置:\n");
scanf_s("%d", &placenum);
printf("请输入插入的值:\n");
scanf_s("%d", &numvalue);
ListInsert(&L, placenum, numvalue);
printf("当前线性表为:");
ListPrint(L);
printf("\n");
break;
case 10://删除元素
printf("请输入位置:\n");
scanf_s("%d", &placenum);
printf("删除的元素:%d\n",ListDetele(&L, placenum));
break;
case 11:
break;
case 12://销毁
Desttroylist(&L);
break;
case 13://打印
ListPrint(L);
printf("\n");
break;
default:
break;
}
}
return 0;
}