静态链表
1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标
2.最后一个的节点存放第一个由数值得下标
3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标
4.最后一个存储数据的节点的游标为0
静态链表主要是根据游标来遍历,以前没有指针用的思想
假如我要删除一个元素
图不多描述,自己画画就明白,然后代码部分。都有注释,
#include <stdio.h>
#define ElemType int
#define Status int
#define MAXSIZE 1000
typedef struct{
ElemType data;//数据
int cur; //游标
}Component,StaticLinkList[MAXSIZE]; //初始化静态链表
Status InitList (StaticLinkList space) //初始化静态链表等于初始化数组
{
int i;
for (i=;i<MAXSIZE-;i++)
space [i].cur=i+; //给所有节点的游标赋值 space[MAXSIZE-].cur =; //最后节点的游标为第一个元素
return ;
} //获取备用链表的第一个元素下标 (插入操作)
int Malloc_SLL(StaticLinkList space)
{
int i=space[].cur; //用i存储静态链 表第一个节点的游标
if(space[].cur) //如果首个的游标不为零,则最后一个节点的游标赋值给首节点
space[].cur=space[i].cur; //把下一个作为备用链表的第一个元素 return i; //要插入的下标
} //获得链表的长度
int ListLength(StaticLinkList L)
{
int j=; //用来计算
int i=L[MAXSIZE-].cur; //最后一个元素的游标,即首个存数据的节点的下标 while (i) //下标不为0执行循环
{
i =L[i].cur; //遍历知道最后一个存数据的节点的下标为0
j++;
}
return j;
} //在静态链表L中第i个元素之前插入新的数据元素e
Status ListInsert(StaticLinkList L,int i,ElemType e)
{
int j,k,l; k=MAXSIZE -;
if (i< || i>ListLength(L)+)
return -; j=Malloc_SLL(L); //获取备用链表的第一个元素下标
if (j) //如果静态链表不为空
{
L[j].data=e; //把值插入备用链表的第一个元素
for (l=;l<=i-;l++) //获取它之前元素的游标
k=L[k].cur; L[j].cur=L[k].cur; //把获取的游标赋值给新插入的游标
L[k].cur=j; //把新插入的节点的下标赋值给第i-1个节点的游标
return ; }
return -;
} //将下标为K的空闲节点回收到备用表中
void Free_SLL(StaticLinkList space,int k)
{
space[k].cur=space[].cur;
space[].cur=k;
} //删除在L中的第i个元素数据
Status ListDelete(StaticLinkList L,int i)
{
int j,k;
if (i< ||i>ListLength(L)) //超出长度,退出程序
return -; k=MAXSIZE -; //首个存数据的游标
for(j=;j<=i-;j++) //获取要删除元素的前一个游标
k=L[k].cur; j=L[k].cur;
L[k].cur=L[j].cur; Free_SLL(L,j);
return ;
}
插入原理:主要找到要插入的位置的前一个节点游标,将其游标改为插入元素的下标,插入元素的游标记录下一个的下标。
虽然静态链表被指针取代了,但是这思想要懂,以后开发的时候可以用到。