#include <stdio.h>
#include <stdlib.h>
//定义bool函数
#define bool char
#define true 1
#define false 0
//定义变量
#define MaxSize 10 //静态顺序表的最大容量
#define InitSize 10 //动态顺序表的最大容量
//自定义数据元素类型
#define Elemtype int //后期可以直接改变数据类型,不用挨个改
//静态顺序表结构
typedef struct SqList
{
int length; //目前表中的元素个数(长度)
Elemtype data[MaxSize]; //储存数据元素的数组
}SqList;
//动态顺序表结构
typedef struct SeqList
{
int length;
Elemtype *data; //动态顺序表采用指针的方式
int maxsize; //当前可存储的最大个数(长度)
}SeqList;
//静态顺序表初始化
bool InitSqList(SqList* L) //要改变表中内容,必须用指针才能做到
{
L->length = 0; //长度设置为0
return true;
}
//动态顺序表初始化
bool InitSeqList(SeqList* L)
{
L->length = 0;
L->maxsize = InitSize; //最大个数赋值
L->data=(Elemtype*)malloc(sizeof(Elemtype)*InitSize); //开辟一块空间
return true;
}
//静态顺序表的输出
bool PrintSqList(SqList L) //输出不需要改动,所以不用指针
{
if(L.length == 0) //判断合法性
{
printf("SqList is empty!\n");
return false;
}
printf("SqList:");
for(int i = 0; i < L.length; i++)
{
printf("%d->",L.data[i]);
}
printf("End\n");
return true;
}
//动态顺序表的输出
bool PrintSeqList(SeqList L)
{
if(L.length == 0)
{
printf("SeqList is empty!\n");
return false;
}
printf("SeqList:");
for(int i = 0; i < L.length; i++)
{
printf("%d->",L.data[i]);
}
printf("End\n");
return true;
}
//静态表元素插入
bool InsertSqList(SqList* L, int i, Elemtype e)//在i的位置插入元素e
{
if(i < 1 || (L->length + 1) < i)
{
printf("Error!\n");
return false;
}
if(L->length >= MaxSize)
{
printf("Error!\n");
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 InsertSeqList(SeqList* L, int i, Elemtype e)//在i的位置插入元素e
{
if(i < 1 || (L->length + 1) < i)
{
printf("Error!\n");
return false;
}
if(L->length >= InitSize)
{
printf("Error!\n");
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 SqListDelete(SqList* L, int i, Elemtype* e)//删除位置i的元素并得到其值
{
if(L->length <= 0)
{
printf("Empty!\n");
return false;
}
if(i < 1 || (L->length + 1) < i)
{
printf("Error!\n");
return false;
}
*e = L->data[i-1];
for(int j = i-1; j < L->length; j++)
{
L->data[j] = L->data[j+1];
}
L->length--;
return true;
}
//动态顺序表删除元素
bool SeqListDelete(SeqList* L, int i, Elemtype* e)
{
if(L->length <= 0)
{
printf("Empty!\n");
return false;
}
if(i < 1 || (L->length + 1) < i)
{
printf("Error!\n");
return false;
}
*e = L->data[i-1];
for(int j = i-1; j < L->length; j++)
{
L->data[j] = L->data[j+1];
}
L->length--;
return true;
}
//静态表按值查找
int SqListLocElem(SqList L, Elemtype e)
{
for(int i = 0; i < L.length; i++)
{
if(L.data[i] == e)
{
return i+1;
}
}
return 0;
}
//动态表按值查找
int SeqListLocElem(SeqList L, Elemtype e)
{
for(int i = 0; i < L.length; i++)
{
if(L.data[i] == e)
{
return i+1;
}
}
return 0;
}
//动态表的扩容
bool IncreaseSize(SeqList* L, int len) //len是要增加的长度
{
Elemtype *p = L->data; //定义一个指针指向原来指针的位置
L->data = (Elemtype*)malloc(sizeof(Elemtype)*(len+L->length));//给原指针分配一个新空间
for(int i = 0; i < L->length; i++)
{
L->data[i] = p[i];
}
L->maxsize += len;
free(p);
return true;
}
int main()
{
SqList L1; //定义
SeqList L2;
InitSqList(&L1); //初始化
InitSeqList(&L2);
Elemtype e; //测试用
InsertSeqList(&L2,1,1);
InsertSeqList(&L2,2,2);
InsertSeqList(&L2,3,3);
InsertSeqList(&L2,4,4);
SeqListDelete(&L2,3,&e);
PrintSeqList(L2);
}