数据结构 链表(静态链表)

#include "stdio.h"
#define MAXSIZE 100

/**
	静态链表:
		在C语言之前,如Basics、Fortran等早期的编程高级语言,由于没有指针,链表没法是实现
		有人想出用数组来代替链表

		首先让数组的元素怒都是由两个数据与组成   data 和 cur
		数据域data 用来存放数据元素
		游标 cur等同于单链表的next指针,存放钙元素的后继在数组中的下标

		这种用数组描述的链表叫做: 静态链表

**/
typedef struct 
{
	int data;
	int cur;//游标,为0是表示无指向
}StaticLinkList[MAXSIZE];


void InitList(StaticLinkList space);
int Malloc_SLL(StaticLinkList space);
int  ListInsert(StaticLinkList L,int i,int e);
int ListDelete (StaticLinkList L,int i,int *pVal);
void Free_SSL(StaticLinkList space,int j);
int ListLength(StaticLinkList L);
void Show(StaticLinkList L);

/*初始化*/
/*将一位数组space中个分量链成以备用链表*/
/*space[0].cur为头指针,"0"表示空指针 */
void InitList(StaticLinkList space)
{
	int i;
	for (i=0;i<MAXSIZE - 1 ;++i )
	{
		space[i].cur = i+1;
	}
	space[MAXSIZE-1].cur = 0;//目前静态链表为空,最后一个元素的cur为空
	return ;
}


/*分配空间*/
//若备用空间链表非空,则返回分配的节点下标,否则返回0

//注:space[0]不保存数据,保存数据是从space[1]开始,space[0]保存下一个空的位置
int Malloc_SLL(StaticLinkList space)
{
	int i = space[0].cur;//当前数组的第一个元素的cur村的值,就是要返回的第一个备用空闲的下标
	if(space[0].cur)
		space[0].cur = space[i].cur;//拿出一个分量使用,把space[i]的下一个分量(即下一个空位置)作为备用

	return i;//返回分配的结点下标
}


/*插入数据*/
//在L中的第i个位置插入新的数据元素
int  ListInsert(StaticLinkList L,int i,int e)
{
	int j,k,l;
	k  = MAXSIZE - 1;
	if(i<1||i>ListLength(L)+1)
		return 0;//插入位置出错
	j= Malloc_SLL(L);//获取空闲分量下标

	if(j)
	{
		L[j].data  = e;
		for(l=1;l<=i-1;l++)
			k= L[k].cur;//不断循环得到第i-1个数据的下标
		L[j].cur = L[k].cur;//先把当前第i-1数据游标的所指向的位置的下标(即第i个位置)保存到当前插入数据的L[j].cur上
		L[k].cur = j;  //然后改变L[k].cur
		return 1;
	}
	return 0;
}
/*删除在L中第I个数据元素e*/
int ListDelete (StaticLinkList L,int i,int *pVal)
{
	int j,k;
	if (i<1||i>ListLength(L))
	{
		return 0;
	}
	k = MAXSIZE -1;
	for(j=1;j<=i-1;j++)
	{
		k = L[k].cur;//得到第i-1个元素的下标
	}
	j= L[k].cur;//得到第i个元素的下表保存到j
	*pVal =L[j].data;//保存第i个元素的值 
	L[k].cur = L[j].cur;//把第i+1的下标赋给第i的下标
	Free_SSL(L,j);
	return 1;
}
//将下标为j的空闲结点回收到备用链表中
void Free_SSL(StaticLinkList space,int j)
{
	space[j].cur = space[0].cur;
	space[0].cur = j;
}
//保存的元素个数,即为静态链表的长度
int ListLength(StaticLinkList L)
{
	int j = 0;
	int i = L[MAXSIZE-1].cur;
	while(i)
	{
		i = L[i].cur;
		j++;
	}
	return j;
}
//打印所有元素的数据
void Show(StaticLinkList L)
{
	int k = MAXSIZE -1;
	int i=L[k].cur;
	while(i!=0)
	{
		printf("%d\n",L[i].data);
		i = L[i].cur;
	}
	
}
void main()
{
	StaticLinkList L;
	InitList(L);
	int val;
	ListInsert(L,1,1);
	ListInsert(L,1,2);
	ListInsert(L,1,3);
	ListInsert(L,1,4);
    ListInsert(L,1,5);
	printf("删除前:静态链表中所有元素的值:\n");
	Show(L);
	ListDelete(L,1,&val);
	printf("删除第1个位置的元素:%d\n",val);
	printf("删除之后:静态链表中的所有值:\n");

	Show(L);
	

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值