首页 > 学院 > 开发设计 > 正文

静态链表单向实现

2019-11-06 06:26:11
字体:
来源:转载
供稿:网友

静态链表的单向实现,初衷是为了模拟没有指针的高级语言,用数组来代替指针来描述单向链表,所用方法为游标实现法

数组元素用两个数据域组成,一个为数据值,一个为当前数据的后继下标

----实现了单向链表的初始化创建 插入 删除

----优点:改进了顺序储存结构中插入删除需要大量移动数据的缺点

----缺点:1.连续分配空间 表长难以确定

                2.失去了顺序结构储存的快速读取功能

总结:为了模拟 为了实现这种巧妙的构思 为了好玩

#include <stdio.h>#include <windows.h>#define MAX_LEN (502)
//不用指针的静态链表 模拟高级语言使用typedef struct node{	int value;	int NextSet;}StaticList;void CreateStaticList(StaticList static_list[],int length_src,int init_num[],int length_put){	int count;	int NullEndSet;	if(static_list == NULL || length_src <= 0 || length_src > MAX_LEN ||init_num == NULL)return ;	memset( static_list,0,length_src*sizeof(StaticList) );	//初始化next指向	for(count = 1;count<length_src-2;count++)	{		static_list[count].NextSet = count+1;	}	static_list[count].NextSet = 0;	NullEndSet = count;	//初始化用户赋值	for(count = 0;count<length_put;count++)	{		static_list[count+1].value = init_num[count];	}	static_list[count].NextSet = 0;//最后的元素向后链接位置为位置0	//初始化空位置头和有数据位置头	static_list[0].value = NullEndSet;//空数据尾位置	static_list[0].NextSet = count+1;//空数据头位置	static_list[length_src-1].value = count;//数据数量	static_list[length_src-1].NextSet = count==0?-1:1;//有数据头位置}
//插入//插入插入位置之前void InsertStaticNode(StaticList static_list[],int length_src,int insertnum,int insertindexset){	int NullSet;	int HeaderSet;	int DataCount;	int count;	int NewNextSet;	int NewLastSet;	if(static_list == NULL || length_src <= 0 || length_src+1 > MAX_LEN ||insertindexset <= 0 ||insertindexset >MAX_LEN)return ;		NullSet = static_list[0].NextSet;//空位置头 也是 插入位置	HeaderSet = static_list[length_src-1].NextSet;	DataCount = static_list[length_src-1].value;	if(insertindexset >  DataCount)	{		PRintf("当前静态链表长度为:%d/n请进行正确位置的添加,谢谢使用/n",DataCount);		return ;	}	static_list[NullSet].value = insertnum;//插入数据	static_list[0].NextSet = static_list[NullSet].NextSet;//更新空位置头	NewLastSet = NewNextSet = HeaderSet;	for(count = 1;count<insertindexset;count++)	{		NewLastSet = NewNextSet;		NewNextSet = static_list[NewNextSet].NextSet;	}	static_list[NullSet].NextSet = NewNextSet;//向后链接	//向前链接	if(1 == insertindexset)	{		static_list[length_src-1].NextSet = NullSet;	}	else	{		static_list[NewLastSet].NextSet = NullSet;	}	static_list[length_src-1].value++;//更新已存在数据数量}//删除void DeleteStaticNode(StaticList static_list[],int length_src,int deleteindexset){	int DataCount;	int HeaderSet;	int NullEndSet;	int count;	int DelLastSet;	int DelNode;	int DelNextNode;	if(static_list == NULL || length_src <= 0 || length_src > MAX_LEN ||deleteindexset <= 0 ||deleteindexset >MAX_LEN)return ;	DataCount = static_list[length_src-1].value;	if(deleteindexset > DataCount) 	{		printf("当前静态链表长度为:%d/n请进行正确位置的删除,谢谢使用/n",DataCount);		return ;	}	HeaderSet = static_list[length_src-1].NextSet;	NullEndSet = static_list[0].value;	if(deleteindexset == 1)//删除头	{		DelNode = HeaderSet;		static_list[length_src-1].NextSet = static_list[HeaderSet].NextSet;	}	else	{		DelNode = DelLastSet = HeaderSet;		for(count = 1;count<deleteindexset;count++)		{			DelLastSet = DelNode;			DelNode = static_list[DelNode].NextSet;		}		if(deleteindexset == DataCount)//删除尾		{			static_list[DelLastSet].NextSet = 0;		}		else//删除中间		{			DelNextNode = static_list[DelNode].NextSet;			static_list[DelLastSet].NextSet = DelNextNode;		}	}	static_list[DelNode].value = 0;//置零	static_list[DelNode].NextSet = 0;//置零	static_list[NullEndSet].NextSet = DelNode;//无数据元素尾添加	static_list[length_src-1].value--;//更新已存在数据数量}int main(){	int head;	StaticList static_list[102] = {0};	int putinarr[] = {3,4,5,7,8,3,3,4,8,56,78,6,2,45};	CreateStaticList(static_list,sizeof(static_list)/sizeof(static_list[0]),putinarr,sizeof(putinarr)/sizeof(putinarr[0]));	InsertStaticNode(static_list,sizeof(static_list)/sizeof(static_list[0]),123131,1);	DeleteStaticNode(static_list,sizeof(static_list)/sizeof(static_list[0]),15);	InsertStaticNode(static_list,sizeof(static_list)/sizeof(static_list[0]),999,14);	head = static_list[sizeof(static_list)/sizeof(static_list[0])-1].NextSet;	while(head)	{		printf("%d  ",static_list[head].value);		head = static_list[head].NextSet;	}	system("pause");	return 0;}

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表