静态链表详解及代码实现

所谓静态链表,就是用数组来实现链式存储结构,目的是方便在不设指针类型的高级程序设计语言中使用链式结构。

优点:和动态链表一样,删除和插入元素时间复杂度低

不足:和数组一样,需要提前分配一块较大的空间、

实现原理:

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

  • 37
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值