静态链表用于 不能使用 指针的 编程语言中。
下面奉上代码:
// StaticLinkList.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdlib.h>
//静态链表的 实现
typedef int Element;
#define INIT_SIZE 10 //为了测试,故意将值设置的很小
enum E_STATE
{
E_STATE_ERROR = 0,
E_STATE_OK = 1,
};
struct slList
{
Element data;
int cur;
};
//静态链表,[0]存储 空闲空间头指针,[INIT_SIZE-2]代表空闲指针的结尾,[INIT_SIZE-1] 存储第一个数据的头指针
E_STATE initList(slList list[]){
for (int i = 0; i < INIT_SIZE - 2; i++)
{
list[i].cur = i+1;//空闲空间头指针
}
list[INIT_SIZE-2].cur = 0;//0 代表 空闲空间指针的 结尾...
list[INIT_SIZE-1].cur = 0;//数据链表头指针为空
return E_STATE_OK;
}
//从空闲空间链表里获取空间
int slList_Malloc(slList list[]){
int space = list[0].cur;
if (space)
{
list[0].cur = list[space].cur;// 分配空间后,将空闲链表指向下一个空间。
}
return space;
}
//将第K个节点 加入到 空闲空间链表
void slList_Free(slList list[],int k){
list[k].cur = list[0].cur;
list[0].cur = k;
}
//只要前驱不为空,就可插入,空链表时的前驱为 init_size -1
E_STATE listInsert(slList list[],int index,Element e){
int pre = INIT_SIZE-1;//--插入点上一个节点的坐标
int times = 0;
while (times < index -1 && pre)
{
pre = list[pre].cur;
times ++;
}
int mallocIndex = slList_Malloc(list);
if (times > index -1 || pre == 0 || mallocIndex == 0)//times > index -1 排除 index 小于1 的情况,mallocIndex == 0 没有空用空间了
{
return E_STATE_ERROR;
}
list[mallocIndex].data = e;
list[mallocIndex].cur = list[pre].cur;
list[pre].cur = mallocIndex;
return E_STATE_OK;
}
E_STATE listDelete(slList list[],int index){
int next = list[INIT_SIZE -1].cur;
int last = INIT_SIZE-1;//记录前驱
int times = 1;
//查找删除的元素的坐标
while (times < index && next)
{
last = next;
next = list[next].cur;
times ++;
}
if (next == 0 || times > index)
{
return E_STATE_ERROR;
}
list[last].cur = list[next].cur;
slList_Free(list,next);
return E_STATE_OK;
}
int listLen(slList list[]){
int len = 0;
int next = list[INIT_SIZE - 1].cur;
while (next)
{
next = list[next].cur;
len ++;
}
return len;
}
//首先打印数据,然后打印空用空间坐标
void listTraverse(slList list[]){
int next = list[INIT_SIZE-1].cur;
printf("------------数据-----------------\n");
while (next)
{
printf("%d\n",list[next].data);
next = list[next].cur;
}
printf("-----------可用空间------------------\n");
int freeIndex = list[0].cur;
while (freeIndex)
{
printf("%d\n",freeIndex);
freeIndex = list[freeIndex].cur;
}
printf("-----------------------------\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
slList list[INIT_SIZE];
initList(list);
for (int i = 1; i < INIT_SIZE; i++)
{
listInsert(list,i,i);
}
printf("----------初始化静态链表--------------\n");
listTraverse(list);
printf("----------删除静态链表--------------\n");
listDelete(list,5);
listDelete(list,listLen(list));
listDelete(list,1);
listDelete(list,2);
listTraverse(list);
printf("----------插入静态链表--------------\n");
listInsert(list,3,111);
listInsert(list,listLen(list),222);
listInsert(list,listLen(list)+1,333);
listTraverse(list);
printf("-------------表长:%d-----------",listLen(list));
return 0;
}