静态链表(单链表的一种形式)
有时,也可以借用一维数组来描述线性链表,我们称这种链表为静态链表。
#define MAXSIZE 100
typedef struct{
ElemType data; // 数据域
int cur; // 另一种形式的指针域
}component, SLinkList[MAXSIZE];
静态链表需要实现插入和删除操作的时候,需要用户自己实现malloc和free两个函数,因此,最好是用游标构成一个备用的链表。
#include <stdio.h>
#include <stdlib.h>
# define MAXSIZE 100
typedef int ElemType;
// 静态链表的定义
typedef struct{
ElemType data;
int cur;
}component, SLinkList[MAXSIZE];
// 使用 游标 链接出未使用的节点
void init_cur(SLinkList *L){
for(int i=0;i<MAXSIZE-1;++i){
(*L)[i].cur = i+1;
// 我们应该要明白一点,传入的东西即是指向数组的指针的指针,因此,我们需要得到数组本身,对其进行取值。
// *(L)[i].cur error; cause [] has higher priority than *
}
(*L)[MAXSIZE-1].cur=0;
}
int malloc_sq(SLinkList *L){
int temp = (*L)[0].cur; // 这个是L[0].cur我们通过对这个值来判断是否进入 满 的状态
if (temp == 0){
// 满,则返回0,即分配空间失败
}else{
(*L)[0].cur = (*L)[temp].cur;
}
printf("[allocate] %d\n", temp);
return temp;
}
void free_sq(SLinkList *L, int i){
// free
(*L)[i].cur = (*L)[0].cur;
(*L)[0].cur = i;
printf("[free] %d\n", i);
}
int main(){
SLinkList sl;
init_cur(&sl);
for (int j=0; j<MAXSIZE; j++){
printf("the cur of %d is:%d\n", j, sl[j].cur);
}
// 测试malloc
for (int i=0; i<MAXSIZE; i++){
int j = malloc_sq(&sl);
if (j != 0){
sl[j].data = 9699;
}else{
printf("the static linklist is full, in this state the value of j is:%d\n", j);
}
}
free_sq(&sl, 20);
malloc_sq(&sl);
return 0;
}