静态链表是在没有指针的前提下通过数组实现链表的方式,每一个元素中包含数据Data和Cur游标。下图表示静态链表的存储方式:
下面就来用代码实现静态链表:
程序结构如上图。
下面一起来看看链表类:
namespace ConsoleApp2
{
class StaticLinkList
{
private int length = 0;
public int Length { get => length; set => length = value; }
static readonly int MAXSIZE = 10;
private static Link[] linkArray;
public StaticLinkList()
{
linkArray = new Link[MAXSIZE];
Init();
}
//初始化链表
private void Init()
{
for (int i = 0; i < MAXSIZE; i++)
{
linkArray[i] = new Link();
linkArray[i].cur = i + 1;
}
}
//静态链表第一个cur存储的是备用链表的下标
private int Malloc()
{
int i = linkArray[0].cur;
if (i>0)
{
linkArray[0].cur = linkArray[i].cur;
}
return i;
}
//添加一个数据项
public void Add(Link l)
{
int temp = Malloc();
//将data值放入第一个备用元素中
linkArray[temp].data = l.data;
//例如一个空的静态链表 第一个元素下标0游标1,第二个元素下标1游标2,依次类推
//在这里第一个备用元素下标是1,下游标是2,由于链表第一个元素的游标用来存放第一个备用元素的下标,代码如下
linkArray[temp].cur = linkArray[0].cur;
AddLength();
}
private void AddLength()
{
Length++;
}
private void DelLength()
{
Length--;
}
//插入元素
public void Insert(int pos,Link l)
{
if (pos > linkArray[0].cur)
{
return;
}
int insertlength = Malloc();
int temp = MAXSIZE - 1;
//循环获得插入位置前一个元素的下标
for (int i = 0; i <= pos-1; i++)
{
temp = linkArray[temp].cur;
}
//将插入数据的游标设置为插入点后一位的下标
l.cur = linkArray[temp].cur;
//将插入位置前一个数据的游标设置为第一个备用元素的下标
linkArray[temp].cur = insertlength;
linkArray[insertlength] = l;
AddLength();
}
public void Delete(int pos)
{
if (pos>linkArray[0].cur)
{
return;
}
int k = MAXSIZE - 1;
for (int i = 1; i <= pos-1; i++)
{
k = linkArray[k].cur;
}
int j = linkArray[k].cur;
linkArray[k].cur = linkArray[j].cur;
free(j);
DelLength();
}
private void free(int a)
{
linkArray[a].cur = linkArray[0].cur;
linkArray[a].data = null;
linkArray[0].cur = a;
}
}
静态链表需要我们自己实现c语言中的Malloc方法和Free方法。
本文根据https://www.cnblogs.com/student-note/p/6270946.html进行理解,感谢博主!