#include <stdio.h>
#include <stdbool.h>
#include <malloc.h>
#define INIT_SIZE 50
#define INCRE_SIZE 20
typedef int ElemType;
typedef struct SQLIST
{
ElemType* data; //存储空间基址
int size; //当前元素个数
int maxsize;//最大长度
}SqList,*SqListPtr;
SqListPtr InitList();//初始化顺序表
void ClearList(SqListPtr L);//置空顺序表
bool EmptyList(SqListPtr L);//判断表是否为空
int LengthList(SqListPtr L);//返回顺序表长度
void GetElem(SqListPtr L, int i, ElemType* e);//用e返回地i个元素的值
void PriorElem(SqListPtr L, ElemType e, ElemType** prior);//e是顺序表中的元素而且不是第一个,用prior返回他的前驱
void NextElem(SqListPtr L, ElemType e, ElemType** next);//e是顺序表中的元素而且不是最后一个,用next返回他的后继
void InsertList(SqListPtr L, int i, ElemType e);//在顺序表的第i个位置之前插入元素e如果初始空间不足,则扩充空间内存
void DeleteList(SqListPtr L, int i, ElemType* e);//删除表中第i个元素,并用e返回他的值
void PrintList(SqListPtr L);//打印顺序表
int main()
{
puts("初始化顺序表");
SqListPtr L = InitList();
if (EmptyList(L))
{
puts("此时顺序表为空");
}
puts("把1到20插入顺序表");
for (int i = 1; i <= 20; i++)
{
InsertList(L, i, i);
}
if (!EmptyList(L))
{
puts("此时顺序表不为空");
}
puts("输出顺序表长度");
printf("%d\n", LengthList(L));
puts("打印顺序表");
PrintList(L);
puts("再将21到80插入表中");
for (int i = 21; i <= 80; i++)
{
InsertList(L, i, i);
}
puts("输出顺序表长度");
printf("%d\n", LengthList(L));
puts("打印顺序表");
PrintList(L);
puts("输出8的前驱与后继");
ElemType* prior = NULL;
ElemType* next = NULL;
PriorElem(L, 8, &prior);
NextElem(L, 8, &next);
printf("8的前驱是%d 后继是%d\n", *prior, *next);
puts("删除第10个元素并赋值给e");
ElemType e;
DeleteList(L , 10, &e);
printf("e的值是%d\n", e);
puts("打印顺序表");
PrintList(L);
puts("清空顺序表");
ClearList(L);
if (EmptyList(L))
{
puts("此时顺序表为空");
}
system("pause");
return 0;
}
SqListPtr InitList()
{
SqListPtr L = (SqListPtr)malloc(sizeof(SqList));
L->data = (ElemType*)malloc(sizeof(ElemType) * INIT_SIZE);
L->maxsize = INIT_SIZE;
L->size = 0;
return L;
}
void ClearList(SqListPtr L)
{
if (L->size == 0 || L == NULL)
{
return;
}
free(L->data);
L->data = (ElemType*)malloc(sizeof(ElemType) * INIT_SIZE);
L->maxsize = INIT_SIZE;
L->size = 0;
}
bool EmptyList(SqListPtr L)
{
if (L == NULL)
{
exit(0);
}
if (L->size == 0)
{
return true;
}
else
{
return false;
}
}
int LengthList(SqListPtr L)
{
if (L == NULL)
{
exit(0);
}
return L->size;
}
void GetElem(SqListPtr L, int i, ElemType* e)
{
if (L == NULL || i > L->size || i < 1)
{
return;
}
*e = *(L->data + i - 1);
}
void PriorElem(SqListPtr L, ElemType e, ElemType** prior)
{
if (L == NULL)
{
return;
}
int i = 2;
while (i <= L->size)
{
if (e == *(L->data + i - 1))
{
*prior = L->data + i - 2;
break;
}
i++;
}
}
void NextElem(SqListPtr L, ElemType e, ElemType** next)
{
if (L == NULL)
{
return;
}
int i = 1;
while (i < L->size)
{
if (e == *(L->data + i - 1))
{
*next = L->data + i;
break;
}
i++;
}
}
void InsertList(SqListPtr L, int i, ElemType e)
{
if (L == NULL || i > L->size + 1 )
{
return;
}
if (L->size + 1 > L->maxsize)
{
L->data = (ElemType*)realloc(L->data, sizeof(ElemType) * (L->maxsize + INIT_SIZE));
L->maxsize += INIT_SIZE;
}
int count = L->size + 1;
while (count >= i)
{
*(L->data + count) = *(L->data + count - 1);
count--;
}
*(L->data + i - 1) = e;
L->size++;
}
void DeleteList(SqListPtr L, int i, ElemType* e)
{
if (L == NULL || i < 1 || i > L->size)
{
return;
}
*e = *(L->data + i - 1);
while (i <= L->size)
{
*(L->data + i - 1) = *(L->data + i);
i++;
}
L->size--;
}
void PrintList(SqListPtr L)
{
if (L == NULL || EmptyList(L))
{
return;
}
for (int i = 1; i <= L->size; i++)
{
printf("%d ", *(L->data + i - 1));
}
putchar('\n');
}