静态链表的创建以及基本操作

#include <stdio.h>
#include <stdlib.h>
#define Max 100

typedef int ElemType;
/*定义每个节点的数据信息*/
typedef struct Node
{
	ElemType data;//节点中存放的抽象数据
	int next;//记录下一个节点的位置(位置由下标唯一决定)这里的next就是下个元素在结构体数组中的下标
}SLNode;

/*静态链表的定义*/
typedef struct Static_List
{	
	SLNode store[Max];//静态的申请了连续的Max个结构体大小的空间
	int free_h;//首个空节点的下标,类比如链表中的入口地址
}Sqlist;


int main()
{
	int Init_Static_List(Sqlist *l);
	int Creat_Static_List(Sqlist *l);
	int Length_List(Sqlist l);
	int Judge_List_Empty(Sqlist l);
	int Judge_List_Full(Sqlist l);
	int Insert_List(Sqlist *l);
	int Research_List(Sqlist l);
	int Delete_List(Sqlist *l);
	void Show_List(Sqlist l);

	Sqlist SL;
	Init_Static_List(&SL);//静态链表的初始化操作
	Creat_Static_List(&SL);//创建静态链表

	/*调用插入函数,判断插入位置是否合法,不合法则重新输入*/
	while(-1==Insert_List(&SL))
	{
		printf("The position you insert is illegal!\nPlease input the right position:\n");
		Insert_List(&SL);
	}

	/*提示链表的状态。为空或者满或者非空非满*/
	if(0==Judge_List_Empty(SL))
	{
		printf("Current List is empty!\n");
	}
	else
	{
		printf("Current List is not empty!\n");
		if(1==Judge_List_Full(SL))
			printf("Current List is full!\n");
		else
			printf("The length of current list is:%d\n",Length_List(SL));
	}

	/*调用数据查找函数,地址不合法则重新输入*/
	if(-1==Research_List(SL))
	{
		printf("POSITION ERROR\nPlease input the position again\n");
		Research_List(SL);
	}

	/*调用删除元素函数,地址不合法则重新输入*/
	if(-1==Delete_List(&SL))
	{
		printf("POSITION ERROR\nPlease input the position again\n");
		Delete_List(&SL);
	}
	
	/*显示静态链表的内容*/
	Show_List(SL);	
	return 0;
}
	int Init_Static_List(Sqlist *l)
	{
		int i;
		(*l).store[0].next=-1;//(1)静态的链表刚刚建立的时候其头节点也是尾节点,而尾节点是以其中的next元素为-1定义
		(*l).free_h=1;//链表刚刚建立的时候,所有的空间都是空的,第一个为空的节点下标为1,free_h赋值为1
		for(i=(*l).free_h;i<=Max-2;i++)
		{(*l).store[i].next=i+1;}
		(*l).store[Max-1].next=-1;//(1)中的-1表示的是数据元素空间的结尾,而在这里指的是空闲空间的结尾
		printf("The static list initialed success!!!\n");
		return 0;	
	}
	/*创建静态链表(这里运用的是尾插法)*/
	int Creat_Static_List(Sqlist *l)
	{
		int n,i,tail=0;
		printf("Please input the length of the static list:");
		scanf("%d",&n);
		for(i=1;i<=n;i++)
		{
			printf("Please input NO.%d's data:",i);
			scanf("%d",&(*l).store[(*l).free_h].data);/*首先为空闲链表的第一个元素赋值,它将被接到原先的表尾*/
			/*将(*l).free_h看成一个整体,它代表空闲链表的首个元素地址,同时也是空闲链表的入口参数*/
			(*l).store[tail].next=(*l).free_h;/*将取出的首个元素接到非空闲链表的表尾*/
			tail=(*l).free_h;/*表尾移动,新插入的元素为新的表尾*/
			(*l).free_h=(*l).store[tail].next;/*空闲链表的原先的第一个元素被取走了,所以起始元素的地址向下移动一个单位*/
			(*l).store[tail].next=-1;/*表尾指向-1,这是表尾的标志*/
		}
		return 0;
	}
	/*求长函数的定义*/
	int Length_List(Sqlist l)
	{
		int count=0;
		int i=0;
		while(-1!=l.store[i].next)
		{
			i=l.store[i].next;//i为下一个元素的地址,相当于后移节点,继续判断
			count++;//说明这个节点不为空,count自增一直到循环到链表的结尾,此时得到的就是链表的长度了
		}
		return count;//将链表的长度返回
	}
	/*判空函数定义*/
	int Judge_List_Empty(Sqlist l)
	{
		if(-1!=l.store[0].next)
		return -1;//说明此时的静态链表不为空,首节点的next不等于-1,与上述的(1)相对应
		return 0;
	}
	/*判满函数定义*/
	int Judge_List_Full(Sqlist l)
	{
		if(Max-1==Length_List(l))
		return 1;//说明此时的静态链表为满
		return 0;
	}
	/*静态链表显示函数*/
	void Show_List(Sqlist l)
	{
		int i=0,k=1;
		i=l.store[i].next;//得到第一个元素的地址
		while(-1!=l.store[i].next)
		{
			printf("No.%d 's data is %d\n",k++,l.store[i].data);
			i=l.store[i].next;
		}/*最后一个数据是没有被输出出来的,所以以下对于最后一个元素做了单独的输出*/
		printf("No.%d 's data is %d\n",i,l.store[i].data);
		printf("There is no data left\n");
	}
	/*静态链表插入数据函数*/
	int Insert_List(Sqlist *l)
	{
		int n,i=1,q,p=0;
		int k=1;
		printf("Please input the position of the new data:");
		scanf("%d",&n);
		if(n<1||n>Length_List(*l)+1)
			return -1;//判断插入的位置是否合法
		for(i=1;i<n;i++)
		{p=(*l).store[p].next;}//找到插入位置的上一个位置
		q=(*l).free_h;//找到空闲链表的首位置,给新元素预留
		printf("Please input the new data:");	
		scanf("%d",&(*l).store[q].data);//在预留的位置上赋值新元素的内容
		(*l).free_h=(*l).store[q].next;//空闲链表首位置下移
		(*l).store[q].next=(*l).store[p].next;//将指定位置的上个元素的next位置改给新元素
		(*l).store[p].next=q;//将新元素接入到指定位置的上一个元素后面
		return 0;
	}

	
	int Research_List(Sqlist l)
	{
		int n,i,p=0;
		printf("Please input the position of the data be searched:");
		scanf("%d",&n);
		if(n<1||n>Length_List(l))/*判断查找位置的合法性*/
			return -1;
		else
		{
			for(i=1;i<=n;i++)
			{p=l.store[p].next;}//循环查找到相应的位置
			printf("The data you rearched is :%d\n",l.store[p].data);
		}
		return 0;
	}

	int Delete_List(Sqlist *l)
	{
		int i,n,p=0,q;
		printf("Please input the delete_data's position:");
		scanf("%d",&n);
		if(n<1||n>Length_List(*l))
			return -1;//判断删除的位置是否合法
		for(i=1;i<n;i++)
		{p=(*l).store[p].next;}//找到删除位置的上一个位置
		q=(*l).store[p].next;//找到删除的元素位置
		(*l).store[p].next=(*l).store[q].next;//将删除元素的上一个元素的next指向删除元素的下一个位置
		(*l).store[q].next=(*l).free_h;//将删除的元素的空间加入到空闲链表的头部
		(*l).free_h=q;//空闲链表的起始地址改变为新加入的删除元素的位置
		return 0;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值