前言:
静态链表,一定要细心,多琢磨,一定清楚第一个和最后一个元素是干嘛的,以及它的对应的游标啥意思
有问题可以在直接评论,会回复的
代码用C语言实现,可以直接运行看效果
效果图:
#include <stdio.h>
#include <malloc.h>
#define MaxSize 150
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef struct StaticLink{
ElemType data;
int cur;
}StaticLink,StaticLinkList[MaxSize];
/*初始化链表*/
int InitStaticLink(StaticLinkList slk)
{
int i = 0;
while(i<MaxSize-1)
{
slk[i].cur = i+1;
slk[i].data = 0; //给个默认值,好调试
i++;
}
slk[MaxSize-1].cur = 0; //链表为空,最后一个元素游标为0
return OK;
}
/*计算链表长度*/
int LenghtSLink(StaticLinkList slk)
{
int index=slk[MaxSize-1].cur;
int lenght=0;
while(index)
{
index=slk[index].cur;
lenght++;
}
return lenght;
}
/*返回可以插入数据的结点下标*/
int MallocSLink(StaticLinkList slk)
{
int i = slk[0].cur; //可以插入数据的地方,也就是下标
slk[0].cur = slk[i].cur;
return i;
}
/*向静态链表插入数据*/
int InsertSLink(StaticLinkList slk,int i,ElemType e)
{
if(i<1 || i>LenghtSLink(slk)+1) //判断插入位置,链表是否满了
return ERROR;
int index = MallocSLink(slk);
int begin = MaxSize-1;
for(int j=1;j<i;j++) //找到第i个元素之前的那个元素位置
begin = slk[begin].cur;
slk[index].data=e; //把数据放进去
slk[index].cur=slk[begin].cur; //把第i-1个元素游标的值 给 第i个元素的游标
slk[begin].cur=index; //把第i-1元素的游标值改成第i个元素的下标
return OK;
}
/*释放该下标的结点*/
void FreeSLink(StaticLinkList slk,int index)
{
slk[index].cur=slk[0].cur; //把可以用的、结点的下标、的值,赋给刚才那个删除的结点,这样就可以先用删除的节点了
slk[0].cur=index; //把游标改为刚删除结点的下标
}
/*静态链表删除数据元素,
删除只是改了游标,值还在,只不过下次插入数据会优先使用删除的结点,新值直接覆盖掉旧值,相当于删除了*/
int DeleteSLink(StaticLinkList slk,int i)
{
if(i<1||i>LenghtSLink(slk)+1)
return ERROR;
int begin = MaxSize-1;
int j;
for(j = 1 ; j<i ; j++)
{
begin = slk[begin].cur;
}
j = slk[begin].cur; //链表是通过游标链起来的,不是数组直接点下标就可以了,j是要删除元素的下标
slk[begin].cur=slk[j].cur; //把要删除元素游标域的值,给j-1个元素的游标域
FreeSLink(slk,j); //释放该结点,使之成为备用结点
return OK;
}
int main(void)
{
StaticLinkList slk;
InitStaticLink(slk);
int address = 1,e=666;
while(address<=10)
{
InsertSLink(slk,address,e);
e = e + 111;
address++;
}
InsertSLink(slk,6,6666); //新增一结点,看游标变化
for(int i=0;i<MaxSize;i++)
{
printf("下标:%d \t 数据域:%d \t 游标域:%d\n",i,slk[i].data,slk[i].cur);
}
printf("\n");
DeleteSLink(slk,1); //删除第一个结点,看游标变化
for(int i=0;i<MaxSize;i++)
{
printf("下标:%d \t 数据域:%d \t 游标域:%d\n",i,slk[i].data,slk[i].cur);
}
return 0;
}