专题三-可复用静态链表

原创 2013年12月03日 10:56:13
//main.c文件
#include <stdio.h>
#include <stdlib.h>
#include "StaticList.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) 
{
	StaticList* list = StaticList_Create(10);
	
	int index = 0;
	
	int i = 0;
	int j = 1;
	int k = 2;
	int x = 3;
	int y = 4;
	int z = 5;
	
	//插入结点 
	StaticList_Insert(list, &i, 0);
	StaticList_Insert(list, &j, 0);
	StaticList_Insert(list, &k, 0);
	StaticList_Insert(list, &x, 0);
	StaticList_Insert(list, &y, 0);
	StaticList_Insert(list, &z, 0);
	
	//遍历静态链表 
	for (index=0; index<StaticList_Length(list); index++) {
		int* p = (int*)StaticList_Get(list, index);
		
		printf("%d\n", *p);
	}
	
	printf("\n");
	
	//删除结点
	while (StaticList_Length(list) > 0) {
		int* p = (int*)StaticList_Delete(list, 0);
		
		printf("%d\n", *p);
	} 
	
	printf("\n");
	
	//插入结点 
	StaticList_Insert(list, &x, 0);
	StaticList_Insert(list, &y, 0);
	StaticList_Insert(list, &z, 0);
	
	//输出大小 长度 
	printf("Capacity: %d Length: %d\n", StaticList_Capacity(list), StaticList_Length(list));		
	
	//遍历 
	for (index=0; index<StaticList_Length(list); index++) {
		int* p = (int*)StaticList_Get(list, index);
		
		printf("%d\n", *p);
	}	
	
	//销毁静态链表 
	StaticList_Destroy(list);
	
	return 0;
}


//StaticList.c文件
#include <stdio.h>
#include <stdlib.h>
#include "StaticList.h"

//可用标识符 
#define AVAILABLE -1

/*静态链表结点定义*/
typedef struct _tag_StaticListNode {
	unsigned int data;	//数据域 
	int next;		//下一个结点下标 
} TStaticListNode;

/*静态链表结构体定义*/
typedef struct _tag_StaticList {
	int capacity;		//容量 
	TStaticListNode header;	//头结点 
	TStaticListNode node[]; //结点 	//柔性数组 
} TStaticList;

/*初始化静态链表*/
StaticList* StaticList_Create(int capacity)
{
	TStaticList* ret = NULL;
	int i = 0;
	
	if (capacity >= 0) {
		ret = (TStaticList*)malloc(sizeof(TStaticList) + sizeof(TStaticListNode) * (capacity+1));	
	}
	
	if (ret != NULL) {
		ret->capacity = capacity;
		ret->header.data = 0;	//复用  作为链表长度 
		ret->header.next = 0;	//第一个结点的下标 
		
		//标识为可用状态 
		for (i=1; i<=capacity; i++) {
			ret->node[i].next = AVAILABLE;	
		}
	}
		
    	return ret;
}

/*释放静态链表*/
void StaticList_Destroy(StaticList* list)
{
	free(list);
}

/*清空静态链表*/
void StaticList_Clear(StaticList* list)
{
	TStaticList* sList = (TStaticList*)list;
	int i = 0;
	
	if (sList != NULL) {
		sList->header.data = 0;
		sList->header.next = 0;
		
		//标识为可用状态 
		for (i=1; i<=sList->capacity; i++) {
			sList->node[i].next = AVAILABLE;	
		}
	}
}

/*获取长度*/
int StaticList_Length(StaticList* list)
{
	TStaticList* sList = (TStaticList*)list;
	int ret = -1;
	
	if (sList != NULL) {
		ret = sList->header.data;
	}		
	
    	return ret;
}

/*获取容量*/
int StaticList_Capacity(StaticList* list)
{
	TStaticList* sList = (TStaticList*)list;
	int ret = -1;
	
	if (sList != NULL) {
		ret = sList->capacity;
	}		
	
    	return ret;	
}

/*插入结点*/
int StaticList_Insert(StaticList* list, StaticListNode* node, int pos)
{
	TStaticList* sList = (TStaticList*)list;
	int ret = (sList != NULL);
	int current = 0;
	int index = 0;	//标识可用位置下标 
	int i = 0;
	
	ret = ret && (sList->header.data+1 <= sList->capacity); 
	ret = ret && (pos >= 0) && (node != NULL);
	
	if (ret) {
		//查找可用位置 
		for (i=1; i<sList->capacity; i++) {
			if (sList->node[i].next == AVAILABLE) {
				index = i;
				break;	
			}
		}
		
		//插入结点
		sList->node[index].data = (unsigned int)node;
		
		sList->node[0] = sList->header;
		
		//开始移动结点 找pos位置 
		for (i=0; (i<pos) && (sList->node[current].next != 0); i++) {
			current = sList->node[current].next;	
		} 
		
		//修改指向 
		sList->node[index].next = sList->node[current].next;
		sList->node[current].next = index;
		
		//长度加1
		sList->node[0].data++;
		
		//更新表头信息 
		sList->header = sList->node[0]; 
	}
			
    	return ret;
}

/*获取结点元素*/
StaticListNode* StaticList_Get(StaticList* list, int pos)
{
	TStaticList* sList = (TStaticList*)list;
	StaticListNode* ret = NULL;
	int i = 0;
	int current = 0;
	int object = 0;
	
	if ((sList != NULL) && (0 <= pos) && (pos < sList->header.data)) {
		sList->node[0] = sList->header;
		
		//开始找pos位置的下标
		for (i=0; i<pos; i++) {
			current = sList->node[current].next;	
		}
		
		//保存pos位置下标 
		object = sList->node[current].next;
		
		//取值 
		ret = (StaticListNode*)(sList->node[object].data);
	}
		
	return ret;
}

/*删除结点*/ 
StaticListNode* StaticList_Delete(StaticList* list, int pos)
{
	TStaticList* sList = (TStaticList*)list;
	StaticListNode* ret = NULL;
	int i = 0;
	int current = 0;
	int object = 0;
	
	if ((sList != NULL) && (0 <= pos) && (pos < sList->header.data)) {
		sList->node[0] = sList->header;
		
		//开始找pos位置的下标
		for (i=0; i<pos; i++) {
			current = sList->node[current].next;	
		}
		
		//保存pos位置下标 
		object = sList->node[current].next;
		
		//删除结点 
		sList->node[current].next = sList->node[object].next;
		
		//长度减一 
		sList->node[0].data--;
		
		//更新表头信息 
		sList->header = sList->node[0];
		
		//标识为可用状态 
		sList->node[object].next = AVAILABLE;
		
		//取值 
		ret = (StaticListNode*)(sList->node[object].data);
	}
		
	return ret;
}

//StaticList.h文件
#ifndef _STATICLIST_H_
#define _STATICLIST_H_

typedef void StaticList;
typedef void StaticListNode;

StaticList* StaticList_Create(int capacity);

void StaticList_Destroy(StaticList* list);

void StaticList_Clear(StaticList* list);

int StaticList_Length(StaticList* list);

int StaticList_Insert(StaticList* list, StaticListNode* node, int pos);

StaticListNode* StaticList_Get(StaticList* list, int pos);

StaticListNode* StaticList_Delete(StaticList* list, int pos);

#endif


相关文章推荐

专题三-链表

无招胜有招-静态链表 顺序表的思考 继续讨论中。。。。 学生A:单链表很完美,我觉得顺序表可以退休了。 学生B:我也觉得,老师为什么还要教我们顺序表呢? 学生A:那不是为了展现单链表的强大嘛! 学生B...

可复用链表

  • 2014年12月14日 19:39
  • 1KB
  • 下载

数据结构复习笔记-静态链表

  • 2015年10月29日 16:48
  • 161KB
  • 下载

五、创建一个可复用的双向链表

一、DLinkList.h #ifndef _DLINKLIST_H_ #define _DLINKLIST_H_ typedef void DLinkList; typedef struct...

数据结构-基本算法-静态链表

  • 2017年05月21日 18:47
  • 2KB
  • 下载

c语言实现静态链表

  • 2017年03月17日 23:25
  • 2KB
  • 下载

四、创建一个可复用的循环链表

一、CircleList.h #ifndef _CIRCLELIST_H_ #define _CIRCLELIST_H_ typedef void CircleList; typede...

静态链表实现

  • 2016年04月11日 22:14
  • 5KB
  • 下载

可复用单链表的实现

/******************LinkList.h**********************/ #ifndef LINKLIST_H_ #define LINKLIST_H_ typede...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:专题三-可复用静态链表
举报原因:
原因补充:

(最多只允许输入30个字)