所谓静态链表,就是用数组来实现链式存储结构,目的是方便在不设指针类型的高级程序设计语言中使用链式结构。
优点:和动态链表一样,删除和插入元素时间复杂度低
不足:和数组一样,需要提前分配一块较大的空间、
实现原理:
1、使用结构体数组,结构体有指针域 cur 和数据域 data
2、一个数组分量表示一个节点,用cur代替指针指示节点在数组中的相对位置
3、数组逻辑上分为两个链表:备用链表(空闲的节点)和数据链表(已被使用的节点)
静态链表的理解重点在于:
1、如何实现两条链,两条链之前有什么联系
2、插入删除时数组的变化
3、cur域是如何代替指针工作的
(修正:下标为1的结点为数据链头结点,数据域应为空)
由图1可以看出,初始化就是使整个数组所有分量都包含在备用链表中
由图1、2可以看出,静态链表的插入就是 把节点 x 从备用链表中删除,然后将节点 x 插入数据链中
由图4、5可以看出,静态链表的删除就是 把节点 x 从数据链中删除,然后将节点 x 插入备用链表中
先定义结构体:
#include<stdio.h>
#define maxsize 30
typedef char elemtype;
typedef struct{
int cur;
elemtype data;
}slink,slinklist[maxsize];
定义初始化函数(对应图1):
void initspace_sl(slink *space)
{//将数据各分量链接成一个备用链表,space[0]代表头指针
int i;
for(i=0;i<maxsize-1;i++)
{
space[i].cur=i+1;
}//下标为i结点的后继为下标是i+1的结点
space[maxsize-1].cur=0;//0表示空指针
}
用户需要自己实现malloc函数和free函数
实现过程如下:
int malloc_sl(slink *space)
{//若备用链表非空,则返回分配节点下标,否则返回0。
int i;
i=space[0].cur;
if(space[0].cur)
{
space[0].cur=space[i].cur;//使头结点后继等于I结点的后继
}//既在备用链表中删除i节
return i;
}
int free_sl(slink *space,int k)
{//将下标为k的空闲节点回收到备用链表中
space[k].cur=space[0].cur;
space[0].cur=k;
}
以集合(A-B)∪(B-A)运算为例:
思想:假设由终端输入数据,先建立表示集合A的静态链表S,然后在输入集合B元素的同时对静态链表S进行查找,如果存在相同的元素则从S表中删除,否则将此元素插入表S中。
当集合A为{A,B,C},集合B为{D,E,A,}
代码如下:
int difference_sl(slink *space,int *k)
{
int q,w,r,t,y,u,a;
elemtype ch;
initspace_sl(space);
*k=malloc_sl(space);//k表示返回的头结点
q=*k;//q指向最后一个结点
scanf("%d%d",&w,&r);//输入A、B的大小
for(int i=1;i<=w;i++)//将集合A中的数据依次插入静态链表中
{
t=malloc_sl(space);
scanf("%c",&space[t].data);
space[q].cur=t;
q=t;
}
space[q].cur=0;//最后一个结点的后继为空指针
for(int j=1;j<=r;j++)//读取B集合的元素
{
scanf("%c",&ch);
y=*k;//y指向头结点
u=y;
while(space[y].data!=ch&&y!=space[q].cur)
{//查找ch
u=y;//u指向上一结点
y=space[y].cur;
}
if(y==space[q].cur)//未找到,做插入操作
{
a=malloc_sl(space);
space[a].data=ch;
space[a].cur=space[q].cur;
space[q].cur=a;
q=a;
}
else//找到,做删除操作
{
space[u].cur=space[y].cur;
free_sl(space,y);
if(y==q){
q=u;
}
}
}
}
main函数:
int main()
{
slinklist space;
int x,y;
difference_sl(space,&x);
y=x;
while(y)
{//遍历静态链表
printf("%3d %c\n",y,space[y].data);
y=space[y].cur;
}
}
上学期刚学完数据结构,刚好趁着暑假总结完,本着互联网人分享的原则,将个人理解与感悟供大家参考,希望对大家有所帮助,由于水平有限,如有不足之处欢迎指正。
代码下载链接:https://download.csdn.net/download/qq_23856059/10582873