今天是努力学习数据结构的第二天。
首先,静态链表不同于普通链表,它本质上是一个固定长度的数组,每个元素包含其数据(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.
439

被折叠的 条评论
为什么被折叠?



