定义:用数组描述的链表叫做静态链表。
我们对数组的第一个和最后一个位置做了特殊处理,不存数据
未被使用的数组元素成为备用链表。
下标为0的元素的cur存放备用链表的第一个节点的下标。
数组最后一个元素的cur存放第一个有数值的元素的下标
注意链表的形成是用cur连到一起的
#include "string.h"
#include "ctype.h"
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 1000 /* 存储空间初始分配量 */
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef char ElemType; /* ElemType类型根据实际情况而定,这里假设为char */
typedef struct
{
ElemType data;
int cur;
}Component,StaticLinkList[MAXSIZE];
//以节点的下标作为指针
Status InitList(StaticLinkList space){
int i;
for(i=0;i<MAXSIZE-2;i++){
space[i].cur=i+1; //数组的第一个位置用来记录未被使用的第一个位置的下标
}
space[MAXSIZE-2].cur = 0;
space[MAXSIZE-1].cur = 0;//数组的最后一个位置用来记录已经被使用的第一个位置的下标
return OK;
}
Status ListLength(StaticLinkList L){
int k;
k = MAXSIZE-1;
int i,count=0;
while(L[k].cur!=0){
count++;
k=L[k].cur;
}
return count;
}
//若备用的链表非空,返回的是分配的节点下标
int Malloc_SLL(StaticLinkList space){
int i = space[0].cur; //获取到第一个元素位置的下标
if(space[0].cur){//如果还有备用位置
space[0].cur = space[i].cur;//使用下一个位置作为第一个备用位置
}
return i;
}
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_SLL(L);
// printf("j=%d\n",j);
if(j){//如果有空位置
L[j].data = e;
for(l=1;l<=i-1;l++){ //找到第i-1个位置
k = L[k].cur;
}
L[j].cur = L[k].cur; //把第i-1个位置指向的下标赋值给新的存储位置。
L[k].cur = j; //新分配的节点下标
return OK;
}
return ERROR;
}
void Free_SSL(StaticLinkList space , int k){ //删除第k个位置的元素
space[k].cur = space[0].cur ;//把原空闲的位置赋值给释放的位置k
space[0].cur = k; //使k成为第一个备用的位置
}
Status ListDelete(StaticLinkList L ,int i){//注意第i的位置的下标是第i-1位置的cur,不一定是i
int j,k;
if(i<1||i>ListLength(L)){
return ERROR;
}
k=MAXSIZE-1;
for(j=1;j<=i-1;i++){
k = L[k].cur;
}
j = L[k].cur;//第i位置的下标
L[k].cur = L[j].cur;//第i-1位置的下标
Free_SSL(L,j);
return OK;
}
Status ListTraverse(StaticLinkList L)
{
int j=0;
int i=L[MAXSIZE-1].cur;
while(i)
{
printf("%c ",L[i].data);
i=L[i].cur;
j++;
}
return j;
printf("\n");
return OK;
}
int main(){
StaticLinkList L;
Status i;
i=InitList(L);
printf("初始化L后:L.length=%d\n",ListLength(L));
i=ListInsert(L,1,'F');
i=ListInsert(L,2,'E');
i=ListInsert(L,1,'D');
i=ListInsert(L,1,'B');
i=ListInsert(L,1,'A');
printf("\n在L的表头依次插入FEDBA后:\nL.data=");
ListTraverse(L);
i=ListInsert(L,3,'C');
printf("\n在L的“B”与“D”之间插入“C”后:\nL.data=");
ListTraverse(L);
i=ListDelete(L,1);
printf("\n在L的删除“A”后:\nL.data=");
ListTraverse(L);
printf("\n");
return 0;
}