备用链表:可认为没有存值的数组,组成的链表
数组第一个元素的,即下标为0的元素的cur,存放备用链表的第一个结点的下标
备用链表最后一个元素的cur,存放第一个有数值的元素的下标
数组的最后一个元素分量的游标是0
数组第一个元素和最后一个元素不存数据
//静态链表
#include<stdio.h>
#define MAXSIZE 1000
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;
typedef struct {
ElemType data;
int cur;
}Component,StaticLinkList[MAXSIZE];
//将一维数组space中各分量链成一备用链表
Status InitList(StaticLinkList space)
{
int i;
for(i=0;i<MAXSIZE-1;i++)
space[i].cur = i+1; //初始化链表,cur指向下一个
space[MAXSIZE-1].cur=0;
return OK;
}
int Malloc_SLL(StaticLinkList space) {
int i=space[0].cur;//第一个元素cur的值 ,cur存储的是备用链表的第一个
if(space[0].cur){
space[0].cur = space[i].cur;
}
return i;
}
//在L中的第i个元素之前插入新的数据元素e
Status ListInsert(StaticLinkList L,int i,ElemType e) {
int j,k,l;
k=MAXSIZE-1;//首先是最后一个元素的下标
if(i<1||i>ListLength(L)+1){
return ERROR;
}
j=Malloc_SSL(L); //获得空闲分量的下标
if(j){
L[j].data=e;
for(int l=1;l<=i-1;l++){//找到第i个元素之前的位置
k=L[k].cur;//k会是i前一个元素的cur
}
L[j].cur=L[k].cur;//L[j].cur是下一个空闲的分量
L[k].cur=j;
return OK;
}
return ERROR;
}
//删除在L中的第i个元素 e
Status ListDelete(StatusLikList L,int i){
int j,k;
if(i<1||i>ListLength(L)){
return ERROR;
}
k=MAXSIZE-1;
for(j=1;j<=i-1;j++){
k=L[k].cur;
}
j=L[k].cur;
L[k].cur=L[j].cur;
Free_SSL(L,j);
return OK;
}
//静态链表已经存在,操作结果返回L在中数据元素的个数
int ListLength(StaticLinkList L){
int j=0;
int i=L[MAXSIZE-1].cur;
while(i){
i=L[i].cur;
j++;
}
return j;
}
//将下标为k的空闲结点回收到备用链表
void Free_SSL(StaticLinkList space,int k){
space[k].cur = space[0].cur;
space[0].cur=k;
}
int main(){
StaticLinkList space;
InitList (space);
for(int i=0;i<MAXSIZE;i++){
printf("%d\n",space[i].cur);
}
return 0;
}