用数组描述的链表叫做静态链表
静态链表 数组的两个元素都是由数据域组成的,data和cur,数组的每一个下标对应一个data和一个cur。数据域data用来存放数据元素;游标cur相当于单链表里的next指针,存放该元素的后继在数组的下标。
静态链表的初始化构建:
列表中插入数据:
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1000//最大长度为1000
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType data;
int cur;
}Component,StaticLinkList[MAXSIZE];
//将一堆数组space中各分量链成一备用链表
//space[0].cur为头指针
Status InitList(StaticLinkList space) {
int i;
for (i = 0; i < MAXSIZE - 1; i++)
space[i].cur = i + 1;
space[MAXSIZE - 1].cur = 0;//目前静态链表为空,最后一个元素的cur为0,为头结点
return OK;
}
//若备用空间链表非空,则返回分配的节点下标,否则返回0
int Malloc_SLL(StaticLinkList space) {
int i = space[0].cur;//当前数组第一个元素的cur存的值,就是要返回第一个备用空闲的下标
if (space[0].cur)
space[0].cur = space[i].cur;//由于拿出一个分量来使用了,所以把下一个分量用来做备用
return i;
}
//获取静态链表的数组长度
int ListLength(StaticLinkList L) {
int k;
k = MAXSIZE - 1;
int j = 0;
if (L[k].cur == 0) {
return ERROR;//空数组
}
while (L[k].cur)//上标不为0 时
{
k = L[k].cur;
j++;
}
return j;
}
//在第数组L中第i个元素前插入
Status ListInsert(StaticLinkList L, int i, ElemType e) {
int j, k, l;
k = MAXSIZE - 1;//k首先是最后一个元素的下标,他的cur用来存放第一个插入元素的下标,相当于头结点
if (i<1 || i>ListLength(L) + 1) {
return ERROR;
}
j = Malloc_SLL(L);//获得空闲量下标
if (j) {
L[j].data = e;//将数据给他
for (l = 1; l <= i - 1; l++) {//找到第i个元素之前的位置
k = L[k].cur;
}
L[j].cur = L[k].cur;//把第i个元素之前的cur赋值给他
L[k].cur = j;//把空闲量的下标赋值给第i个元素之前的元素的cur
return OK;
}
}
静态链表中删除元素:
代码:
//删除在L中的第i个元素
Status ListDelete(StaticLinkList 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;
L[j].data = NULL;
Free_SSL(L, k);
}
//将下标为k的空闲节点 回收到备用链表
void Free_SSL(StaticLinkList space, int k) {
space[k].cur = space[0].cur;
space[0].cur = k;
}
比较: