1、静态链表的认知
使用静态链表存储数据,数据全部存储在数组中(和顺序表一样),但存储位置是随机的,数组的元素都是由两个数据域组成,data和cur,数据域data用来存储数据,而cur相当于单链表中的next指针,存放该元素的后继在数组中的下标,我们把cur称作游标。
2、静态链表的结构
#include <stdio.h>
#define MAXSIZE 100
typedef struct
{
int data;//数据域
int cur;//指针域
}Component,StaticLinkList[MAXSIZE];
3、备用链表
另外我们对数组第一个和最后一个元素作为特殊元素处理,不存数据,我们通常把未被使用的数组元素称为备用链表。该条链表链接了各个空闲位置。通常,备用链表的表头位于数组下标为0(a[0])的位置,而数据链表的表头位于数组下标为1(a[1])的位置。
4、静态链表的初始化
//初始化
void initList(StaticLinkList space)
{
int i;
for(i=0;i<MAXSIZE-1;i++)
{
space[i].cur = i+1;//将静态链表链接起来
}
space[MAXSIZE-1].cur = 0;//备用区最后一个空间,置为0
space[0].cur = -1;
return ;
}
5、分配空间
//分配空间
int mallocList(StaticLinkList space)
{
//若备用链表非空,则返回分配的结点下标,否则返回0
int i = space[0].cur;//当前数组第一个元素cur存的值
if(space[0].cur)
{
space[0].cur=space[i].cur;
}
return i;
}
六、插入元素
//插入元素,i表示插入的位置,e表示插入的数据
void insertElementList(StaticLinkList space,int i,int e)
{
int j,k,l;
k=MAXSIZE-1;//k为最后一个元素的下标
j = mallocList(space);
if(j)
{
space[j].data = e;//将数据赋值
//找到要插入的位置
for(l=1;l<=i-1;l++)
{
k=space[k].cur;
}
space[j].cur =space[k].cur;
space[k].cur=j;
}
}
七、删除元素
//删除元素
void deleteElementList(StaticLinkList space,int i)
{
int j,k;
k=MAXSIZE-1;
//找到要删除的位置
for(j=1;j<=i-1;j++)
{
k=space[k].cur;
}
j=space[k].cur;
space[k].cur=space[j].cur;
free_List(space,j);
}
八、释放内存
void free_List(StaticLinkList space,int i)
{
space[i].cur=space[0].cur;
space[0].cur=k;
}
九、总结
静态链表在插入和删除时,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中插入和删除操作需要移动大量元素的缺点,但是,没有解决连续存储分配带来的表长难以确定的问题。静态链表不一定会用得上,但这样的思考方式是非常巧妙的。