虽然感觉顺序表稍微有一点麻烦,但是它的优点还是显而易见的:
一是存储密度大:不像链表那样需要额外开辟一个指针域空间;
二是具有随机存取特性:可以通过下标直接访问某个数据,与存储位置无关。(PS.刚开始的时候不是太理解随机存取的意思,后来一想随机不就是在数组中任意的存储嘛,只要存储空间够大,可以存在任意的位置,取数据的时候只要根据地址来取就行了(我真的很笨😭))。
当然,缺点也是不可避免的:
一是插入和删除某个数据时需要移动大量的元素,本篇将为大家进行演示;
二是初始空间的大小不太好分配。
Now,let’s get started.
1.初始化线性表
void InitList(SqList *&L)
{
L=(SqList*)malloc(sizeof(SqList));
L->length=0;
}
2.销毁线性表
void DestroyList(SqList *&L)
{
free(L);
}
3.判断是否为空表
bool EmptyList(SqList *L)
{
return (L->length==0);
}
4.求线性表的长度
void ListLength(SqList *L)
{
return L->length;
}
5.输出线性表
void PrintList(SqList *L)
{
if(EmptyList(L))
return;
for(int i=0;i<L->length;i++)
printf("%-3d",L->data[i]);
}
6.按元素值查找
查找第一个与x相等的元素的逻辑位置,若不存在这一元素,则返回零
int FindList(SqList *L,int x)
{
int i=0;
while(i<L->length&&L->data[i]!=x)
i++;
if(i<L->length)
return i+1;
else
return 0;
}
7.插入数据元素
重磅来啦,插入和删除函数是线性表顺序存储结构的重点。
void Insert(SqList *&L, int x, int i)//x代表要插入元素,i代表插入位置
{
if (i<1 || i>L->length + 1)//检测插入位置是否符合
return;
int j;
for (j = L->length; j > i - 1; j--)
L->data[j] = L->data[j - 1];
L->data[i - 1] = x;
L->length += 1;//切记最后长度要增加1
该算法元素移动次数与L->length和插入位置有关。当i=L->length时,移动次数最少,为0;当i=1时,移动次数最多,为L->length。
因此,时间复杂度最好为O(1),最坏为O(n)。平均时间复杂度为O(n)。
8.删除数据元素
void Delete(SqList *&L, int i)//i代表删除位置
{
if (i<1 || i>L->length)//检查删除位置是否正确
return;
int j;
for (j = i - 1; j < L->length; j++)
L->data[j] = L->data[j + 1];
L->length--;//最后长度减1
}
平均时间复杂度分析与插入元素函数类似,不再赘述。
博客内容浅显,如有错误,欢迎大家指正!