相关定义
线性表的顺序表是指用一组地址连续的存储单元依次存储线性表的数据元素。
顺序表的特点:1)逻辑地址相邻,物理地址也相邻。
2)结构简单、支持随机访问,查找方便。
顺序表的缺点:插入删除较慢。
顺序表与数组的区别:数组只支持数据的存取,顺序表可以进行数据的存取、插入和删除。
数据结构的定义
typedef struct SeqList//定长顺序表
{
int elem[SIZE];//保存数据
int length;//有效数据个数
}SeqList;
typedef SeqList *PSeqList;
功能实现
1、顺序表初始化
//初始化函数
void InitSeqList(PSeqList plist)//PSeqList == SeqList*
{
assert(plist != NULL);
plist->length = 0;//当前无有效数据,即有效数据长度为0
}
2、顺序表数据的插入
//插入数据,数据插入成功返回1,失败返回0
bool Insert(PSeqList plist,int pos,int val)
{
assert(plist != NULL);
if(pos<0 || pos>plist->length || plist->length==SIZE)/*若插入位置下标不合法返回-1/
{
return false;
}
//移动pos后面的数据
for(int i=plist->length-1;i>=pos;i--)
{
plist->elem[i+1] = plist->elem[i];
}
//插入新数据
plist->elem[pos] = val;
//更新有效数据个数
plist->length++;
return true;
}
3、获取顺序表中数据的有效个数
int GetLength(PSeqList plist)
{
return plist->length;
}
4、查找, 找到返回key的下标值,没找到返回-1。
int Search(PSeqList plist,int key)
{
assert(plist != NULL);
for(int i=0;i<plist->length;i++)
{
if(plist->elem[i] == key)
{
return i;
}
}
return -1;
}
5、删除给定值和删除给定位置的值
bool DeleteVal(PSeqList plist,int key)
{
int i = Search(plist,key);
if(i == -1)
{
return false;
}
return DeletePos(plist,i,NULL);
}
//rtval:输出参数,保存删除成功的数据
bool DeletePos(PSeqList plist,int pos,int *rtval)
{
assert(plist != NULL);
if(pos<0 || pos>=plist->length)
{
return false;
}
if(rtval != NULL)
{
*rtval = plist->elem[pos];
}
//移动数据
for(int i=pos;i<plist->length-1;i++)
{
plist->elem[i] = plist->elem[i+1];
}
plist->length--;
return true;
}
6、顺序表的修改。
bool SetVal(PSeqList plist,int pos,int newval)
{
if(pos<0 || pos>=plist->length)
{
return false;
}
plist->elem[pos] = newval;
return true;
}
7、顺序表数据的清除和销毁。
//清除所有数据
void Clear(PSeqList plist)
{
plist->length = 0;
}
//销毁
void Destroy(PSeqList plist)
{
Clear(plist);
}
测试用例
int main()
{
SeqList seq;
InitSeqList(&seq);
for (int i = 0; i<10; i++)
{
Insert(&seq, i, i);
}
DeleteVal(&seq, 5);
Show(&seq);
Insert(&seq, 3, 30);
Show(&seq);
Clear(&seq);
Show(&seq);
return 0;
}
运行结果