看数据结构写代码(5)静态链表

静态链表用于 不能使用 指针的 编程语言中。

下面奉上代码:

// StaticLinkList.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <stdlib.h>//静态链表的 实现typedef int Element;#define INIT_SIZE10 //为了测试,故意将值设置的很小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 -1E_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;}

不论你在什么时候结束,重要的是结束之后就不要悔恨

看数据结构写代码(5)静态链表

相关文章:

你感兴趣的文章:

标签云: