用数组描述的链表叫做静态链表
静态链表 数组的两个元素都是由数据域组成的,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; }
比较: