静态链表依靠数组来实现链表的功能,他在物理上是顺序存储的:
如上图所示为一个静态链表,图示红色区域不作为有效存储单位,其余的未使用的单位简称为备用链表。
资源是要被利用起来的,所以:
1).最左边的红色单位用来存储备用链表的第一个单位的下标,我们可以简单理解为它是备用链表的头节点;
2).最右边单位指向已使用链表。
因为数组下表递增的特性,我们规定自左往右赋值即为链表头插,
根据以上内容可得到相关函数:
typedef struct node
{
int data;
int cur;
}node[10];
void Init(node s1)
{
int i = 0;
for(;i<10-2;i++)
{
s1[i].cur = i+1;
}
s1[i++].cur = -1; //链表满后无备用链表,这时s1[0].cur应为-1,但初始化时不为-1,因此把倒数第二个cur置为-1
s1[i].cur = -1; //初始化时链表只有头节点,因此头节点cur为-1
}
bool Isfull(node s1)
{
return s1[0].cur == -1; //链表满后无备用链表,即s1[0].cur == -1
}
bool inserthead(node s1,int val) //头插
{
if(Isfull(s1))return false;
s1[s1[0].cur].data = val; //备用链表第一个节点赋值
int tmp = s1[0].cur; //保存刚赋值的节点的下标
s1[0].cur = s1[s1[0].cur].cur; //指向下一个节点
s1[s1[0].cur].cur = s1[9].cur; //指向已被使用的上一个节点
s1[9].cur = tmp; //头节点重新赋值
return true;
}
void print(node s1)
{
int index = s1[9].cur;
while(index != -1)
{
printf("%d ",s1[index].data);
index = s1[index].cur; //形如链表的pnext,利用这种特性赋值
}
printf("\n");
}
int searsh(node s1,int val)
{
int index = s1[9].cur;
while(index != -1)
{
if(s1[index].data == val)
{
return index;
}
index = s1[index].cur;
}
return -1;
}
int deletekey(node s1,int key)
{
int front = 9; //链表是不能回退的,因此使用一前一后两个指针
int curent = -1;
while(front != -1)
{
curent = s1[front].cur;
if(s1[curent].data == key)
{
break;
}
front = curent;
}
if(front == -1)return -1; //没有找到要delete的key时,返回
s1[front].cur = s1[curent].cur; //删除节点
s1[curent].cur = s1[0].cur;
s1[0].cur = curent;
return 1;
}