/*
线性表定义:从名字上能够感觉到,是具有像线一样的性质的表。
是零个或多个数据元素的有限序列。
首先它是一个序列,也就是说元素之间是有顺序的,若元素存在多个,则第一个元素无直接前驱,
最后一个元素无直接后继,其他元素每个元素都有一个前驱和后继;
其次,线性表强调有限,假设线性表长度为n,当n=0时表示空表。
*/
//线性表的静态存储结构
#define SIZE 20;//存储空间初始分配量
typedef struct Sqlist
{
int elem[SIZE];//如果通用就写成ElemType*elem;
int length;
}
void InitSqlist(Sqlist *plist)
{
assert(plist!=NULL);
plist->length=0;//把有效元素个数置位0;
}
/*插入思路:如果线性表长度大于等于数组长度,必须动态增加容量;
从最后一个元素往前开始遍历每个元素到i的位置,分别将它们向后移动一个位置;
要将插入元素插入到i的位置;
将表有效长度加1;*/
void Insert(Sqlist *plist,int pos,int val)
{
if(pos<0 || pos>plist->length ||plist->length>=SIZE)
{
return false;
}
for(int i=plist->length-1;i>=pos;i--)
{
plist->elem[i+1]=plist->elem[i];
}
plist->elem[pos]=val;
plist->length++;
return true;
}
/*删除思路:如果删除位置不合理,抛出异常;
取出删除元素;
从删除元素位置开始遍历到最后一个元素,分别将它们向前移动一个位置;
将表有效长度减1;
*/
bool Delete(Sqlist *plist,int pos)
{
if(pos<0 || pos>=plist->length)
{
return false;
}
for(int i=pos;i<plist->length;i++)
{
plist->elem[i]=plist->elem[i+1];
}
plist->length--;
return true;
}
void Destroy(Sqlist *plist)
{
Clear(plist);//默认为静态创建
}
void Clear(Sqlist *plist)
{
plist->length=0;
}
bool IsEmpty(Sqlist *plist)
{
return plist->length==0;
}
int GetLength(Sqlist *plist)
{
return plist->length;
}
bool GetElem(Sqlist *plist,int pos,int *rtval)
{
if(pos<0 || pos>=plist->legth)
{
return false;
}
*rtval=plist->elem[pos];
return true;
}
void Show(Sqlist*plist)
{
for(int i=0;i<plist->length;i++)
{
printf("%d",plist->elem[i]);
}
printf("\n");
}