思路:开辟一段连续的内存段后
把下标为0的内存块作为起始节点,初始化时把这个节点的cur置为-1,而在后续的遍历操作,自然cur值为-1就是终止节点。
把下标为1的内存块记录可分配的索引下标,如果不这样的话,每次我们插入还要遍历去寻找可分配的索引下标,显然这样速度会很慢,后续操作,每次申请节点,可分配节点的索引就是1号节点的cur值。
具体操作
//静态链表
#define MAX 100
#define ElemType char
typedef struct ListNode
{
ElemType data;
int cur; //静态链表中的游标
}ListNode;
//静态链表实际上就是一个结构体数组
typedef ListNode StaticList[MAX];
//ListNode 是一个结构体,而 StaticList 是一个数组类型,实际上是 ListNode 的数组。
//初始化
void InitSList(StaticList &p){
for(int i=1;i<MAX;++i){
p[i].cur=i+1;
}
p[0].cur=-1;
p[MAX-1].cur=0;
}
// 分配静态链表节点的空间
int Malloc_SL(StaticList &p)
{
//p[1]记录可分配的空间索引
int i = p[1].cur;
return i; // 返回分配的节点索引
}
//头插
void Insert(StaticList &p,ElemType x){
int i= Malloc_SL(p);
if(i==0){
printf("申请节点空间失败.\n");
return;
}
p[i].data=x;
if(p[0].cur==-1){
//特殊处理,需要判断第一次的head节点是不是-1,因为这个比较特殊
p[0].cur=p[1].cur;
}else{
//如果head节点不是-1,那么改变后面节点的cur,使它的cur能指向插入节点的索引
p[i-1].cur=p[1].cur;
}
//记录可分配的索引,这个可分配的索引就是插入节点原先的cur值,后面再置为-1
p[1].cur=p[i].cur;
p[i].cur=-1;
}
void ShowSList(StaticList &p){
int i = p[0].cur; // 从链表头开始
while(i != -1){
printf("%c-->", p[i].data);
i = p[i].cur; // 移动到下一个节点
}
}
//静态链表
StaticList SL;
InitSList(SL);
for(int i=0; i<8; ++i)
{
Insert(SL,'A'+i);
}
ShowSList(SL);