数据结构——线性表(静态链表、循环链表以及双向链表)

1、静态链表


用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法

静态链表需要对数组的第一个和最后一个元素作为特殊元素处理,不存数据。

最后一个指向第一个有数据的下标地址,第一个游标指向第一个没有数据的下标地址。

我们对数组的第一个和最后一个元素做特殊处理,他们的data不存放数据;

-我们通常把未使用的数组元素称为备用链表;

-数组的第一个元素,即下标为0的那个元素的cur就存放备用链表的第一个结点的下标

-数组的最后一个元素,即下标为MAXSIZE-1的cur则存放第一个有数值的元素的下标,相当于单链表中的头结点作用。

1.1静态链表的初始化

bool InitList(StaticLinkList list)
{
	int i;
	for(i=0;i<MAXSIZE;i++)
	list[i].cur = i+1;
	list[MAXSIZE-1].cur = 0;  //当前链表为空,所以最后一个元素的cur为0 
	return true;
}

1.2静态链表的插入操作

首先是获得空闲分量的下标:

int Malloc_SLL(StaticLinkList space)
{
	int i = space[0].cur;    //将第一个游标赋值给i,也就是第一个空闲的结点的下标赋值i。
	if(space[0].cur)
		space[0].cur = space[i].cur;

	return i;
}

// 这段代码是给静态链表的第i-1个元素后添加新元素 
bool ListInsert(StaticLinkList list,int i,ElemType e) 
{
	int i,j,l;
	k = MAXSIZE-1;
	if(i < 1 || i > ListLength() + 1)
	  return false;
	j = Malloc_SSL(L);   //获取空闲下标 
	if(j)
	{
		list[i].data = e;   //将数据值赋值给要空闲位置 
		for(l = 1;l<=i-1;l++)
		   k = list[k].cur;    //找到第i-1个元素 
		list[i].cur = list[k].cur; //把第i-1个元素的cur赋值给新元素的cur 
		list[i].cur = j; //把新元素的下标赋值给第i-1个元素的cur; 
		return true;
	}
	return false;
}

1.3静态链表的删除操作

Status ListDelete(StaticLinkList L,int i)
{
	int j,k;
	if(i<1||i>ListLength(L))
	{
		return ERROR;
	}
	k = Max_SIZE-1;
	for(j=0;j<=i-1;j++)
	{
		k = L[k].cur;     //找出要删除元素的前一个元素的下标
	}
	
	j = L[k].cur;         //找到要删除元素的下标
	L[k].cur = L[j].cur;  //把要删除元素的游标赋值给其前一个元素的游标
	
	Free_SLL(L,j);        //释放删除元素的内存
	
	return OK;
}
void Free_SLL(StaticLinkList space,int j)
{
	space[j].cur = space[0].cur;
	space[0] = j;     //删除元素后,该位置变为备用链表表头,数组第一个元素的游标存储第一个空闲结点的下表
}
int ListLength(StaticLinkList L)
{
	int j = 0;
	int i = L[MaxSIZE-1].cur;  //取出有数据的第一个元素的下标
	while(i)
	{
		i = L[i].cur;   //有数据的最后一个元素的游标为0,即为数组第一个元素的下标
		j++;
	}
	return j;
}

1.4静态链表的优缺点总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值