顺序表的实现
顺序表特点:
①逻辑相邻,物理上也相邻
②插入和删除较链表不太方便
顺序表结构体的定义
typedef struct SqList
{
int *elem;//存放动态内存的地址
int length; //有效格子数
int listsize;//总格子数
}Sqlist, *PSqList;
具体实现如下:
(1)初始化
void InitSqList(PSqList ps)
{
assert(ps != NULL);
ps->elem = (int *)malloc(INIT_SIZE*sizeof(int));
ps->length = 0;
ps->listsize = INIT_SIZE;
}
(2)插入:在ps的pos位置,插入数据val(存放数据必须在左边连续存放,将后面的数据后移)
bool Insert(PSqList ps,int pos,int val)//O(n)
{
assert(ps != NULL);
if(pos<0 || pos>ps->length) //判断位置是否合法
{
return false;
}
if(IsFull(ps)) // 调用内部判满函数
{
Inc(ps); //若满,则扩容
}
//将后面的数据右移
for(int i=ps->length-1;i>=pos;i--)
{
ps->elem[i+1] = ps->elem[i];
}
//有效数据个数+1
ps->length++;
return true;
}
(3)判满,内部函数
static bool IsFull(PSqList ps)
{
return ps->length == ps->listsize;
}
(4)扩容,当length=listsize时扩容
static void Inc(PSqList ps)
{
ps->elem = (int *)realloc(ps->elem,ps->listsize*2*sizeof(int));
//ps->length;//不变
ps->listsize *= 2;
}
(5)查找:在ps中查找第一个key值,找到返回下标,失败返回-1
int Search(PSqList ps,int key)
{
for(int i=0;i<ps->length;i++)
{
if(ps->elem[i] == key)
return i;
}
return -1;
}
(6)删除ps中的第一个key
bool DeleteVal(PSqList ps,int key)
{
int i = Search(ps,key);
if(i < 0)//没有key
{
return false;
}
return DeletePos(ps,i);
}
(7)删除ps中pos位置的值
bool DeletePos(PSqList ps,int pos)
{
if(pos<0 || pos>=ps->length)
{
return false;
}
//将后面的数据前移
for(int i=pos;i+1<ps->length;i++)
{
ps->elem[i] = ps->elem[i+1];
}
//有效数据个数--
ps->length--;
return true;
}
(8)获取pos位置的值,成功返回true,失败返回false.成功的值通过rtval带出
bool GetElem(PSqList ps,int pos,int *rtval)
{
if(pos<0 || pos>=ps->length)
{
return false;
}
*rtval = ps->elem[pos];
return true;
}
(9)获取有效数据的个数
int GetLength(PSqList ps)
{
return ps->length;
}
(10)判空
bool IsEmpty(PSqList ps)
{
return ps->length == 0;
}
(11)清空数据,与销毁不同,是将elem中数据清空,即将有效格子数置为0
void Clear(PSqList ps)
{
ps->length = 0;
}
(12)销毁,回收内存
void Destroy(PSqList ps)
{
assert(ps != NULL);
//free(ps);//1 错误
free(ps->elem);
ps->elem = NULL;//3,防止野指针,提高程序健壮性
ps->length = 0;
ps->listsize = 0;
}
(13)输出
void Show(PSqList ps)
{
for(int i=0;i<ps->length;i++)
{
printf("%d ",ps->elem[i]);
}
printf("\n");
}