静态链表用于 不能使用 指针的 编程语言中。
下面奉上代码:
// 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; }
原文地址:http://blog.csdn.net/fuming0210sc/article/details/43834511