码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-02-15 13:32:55      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:数据结构   链表   静态链表   

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

下面奉上代码:

// 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;
}

技术分享

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

标签:数据结构   链表   静态链表   

原文地址:http://blog.csdn.net/fuming0210sc/article/details/43834511

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!