【数据结构】静态链表/2021年11月13日

今天是努力学习数据结构的第二天。

首先,静态链表不同于普通链表,它本质上是一个固定长度的数组,每个元素包含其数据(data)和游标(cur),游标(cur)指向其下一个元素(后继),并且静态链表的第一个元素用于存放待添加元素,其游标指向备用链表的下标。静态链表的最后一个元素不存放数据,其游标指向静态链表的第一个元素。请添加图片描述
实现代码:

#define MAXSIZE 1000
typedef int ElemType;
typedef int Status;

这是静态链表的基本结构
每个结构包含一个data和一个cur

typedef struct
{
	ElemType data;
	int cur;
 } Component,StaticLinkList[MAXSIZE]; 

建立静态链表
采用一个循环,一个接一个(前一个的游标按顺序指向下一个的下标)

 Status InitList(StaticLinkList space)
 {
 	int i;
 	for(i=0;i<MAXSIZE-1;i++)
 	    space[i].cur=i+1;
 	space[MAXSIZE-1].cur=0;
 	return OK;
 }

分配空间
由于这是静态链表,所以我们需要手动实现静态链表的新元素的分配。
首先拿到第一备用元素space[0]的游标,也就是第一个空闲元素的下标,然后安排一个新的备用元素给space[0]。

int Malloc_SLL(StaticLinkList space)     //apply for a space
 {
    int i=space[0].cur;
    if(space[0].cur)
		  space[0].cur=space[i].cur;
	return i;
        
 }

插入新元素
k用于寻找要插入位置的前一个元素,j是要插入的元素,l是后一个元素。
先给j申请空间,然后把数据放里面(data)
用循环找到插入位置的前一个元素
新元素接他的后一个元素
新元素接他的前一个元素

 Status ListInsert(StaticLinkLIst L,int i,ElemType e)
 {
 	int j,k,l;
 	k=MAXSIZE-1;
 	if(i<1||i>ListLength(L)+1)
 	    return ERROR;
    j=Malloc_SLL(L);
    if(j)
    {
    	L[j].data=e;
    	for(l=1;l<i-1;l++)
    	    k=L[k].cur;
    	L[j].cur=L[k].cur;
    	L[k].cur=j;
    	return OK;
	}
	return ERROR;
 }

元素删除
删除第i个元素
先用循环找到待删除元素的前一个的位置
前一个元素接上待删除元素的后一个元素
释放待删除元素的空间
(释放的函数需要手动实现)

Status ListDelete(StaticLinkList L, int i)
 {
 	int j,k;
 	if(i<1||i>ListLength(L))
 	    return ERROR;
 	k=MAXSIZE-1;
 	for(j=1;j<=i-1;j++)
 	    j=L[k].cur;
 	j=L[k].cur;
 	L[k].cur=L[j].cur;
 	Free_SSL(L,j);
 	return OK;
 }

释放一个元素的空间
把首个备用元素的游标赋值给待释放元素的游标。
首个备用元素游标指向待释放元素的位置
这样我们下次使用链表时就会优先使用这个以及释放的元素的位置,然后再用之前的首个备用位置

void Free_SSL(StaticLinkList space,int k)
 {
 	sapce[k].cur=space[0].cur;
 	space[0].cur=k;
 }
 



分割线·············································



第二天了,今天因为体测耽误了补习班和实训…
只要在学校,各种事总是会干涉我的计划
最后,一句名言激励一下自己

个人的发展也要同时代的进程相联系。
The improvement of an individual must be associated with the process of history.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值