在文章开始时先祝大家新年快乐
在本篇文章我想对我知道的顺序链表知识进行总结
首先,顺序链表的定义为一段地址连续的存储单元依次储存线性表的数据元素。这段话真正读起来是比较不好懂的但是我认为这个东西与c语言中的数组是非常相似的,这样会很好理解很多。
然后我们先来看看顺序链表对应的结构代码
#define MAXSIZE 20
typedef int ElemType
typedef struct
{
ElemType data[MAXSIZ];
int length;//用于表示当前链表的长度
}Sqlist;
在看到该数据结构时我们可以发现该结构有三个重要的属性:
1.储存空间的起始位置,此时data的储存位置就是顺序链表对应的储存空间的位置。
2.线性表的最大存储长度,即MAXSIZE。
3.线性表的当前长度,即length。
注意对于2.3两点是有不同的一个是最大的存储长度一个是现在的存储长度。最大存储长度在链表创建后一般是不会发生改变的,但是当前长度一定要随着data中元素的增添和缺失而不断发生改变的。
而下我们将展示一些链表的相关代码和说明
1.GetElem(将链表中的一个位置的相应元素进行返回)
对于该函数的思路是如果我们想要链表中对应的第i个元素进行返回那么我们对data中的第i-1的元素进行查找即可。
int GetElem(Sqlist L,int i,ElemType* e)
{
if(L.length<i || i<1 || L.length == 0)
{
return false:
}
ElemType* e = L.data[i-1];
return ture;
}
2.ListInsert(向链表中插入一个相应的元素)
其相对应的思路为
(1)如果插入时位置出现异常,终止。
(2)如果链表长度大于数组长度应对应的增加相应的data长度或终止。
(3)从最后一个元素开始遍历到第i个元素并将其都向后移动一个位置。
(4)将想插入的元素插入到i位置上
struct ListInsert(SqList* L,int i,ElemType e)
{
int k;
if(L-->length + 1< i || i < 1)
{
return false;
}
if(L-->length == MAXSIZE)
{
return fales;
}
if(i <= L-->length)
{
for(k = L-->length - 1;k >= i-1;k--)
{
L-->data[k] = L-->data[k-1];
}
}
L-->data[i-1] = e;//将元素进行插入
L-->length++;
return ture;
}
3.ListDelete(对链表中的相应元素进行删除)
该函数对应思路
(1)看删除位置是否异常。
(2)取出删除元素。
(3)从删除位置开始进行遍历,直到最后一个元素,分别将他们向前移动一个位置。
(4)链表长度-1。
struct ListDelete(Sqlist8 L;int i;ElemType* e)
{
int k;
if(L-->length == 0)
{
return false;
}
if(i<1 || i>L-->length)
{
return fales;
}
*e = L-->data[i-1];
if(i<L-->length)
{
for(k=i;k<L-->length;k++)
{
L-->data[k-1]=L-->data[k];
}
}
L-->length--;
return ture;
}
以上就是顺序链表中常见的3种操作即其代码组成,好的就这样吧。如果有写错的地方希望大家指出