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

本文详细介绍了静态链表的基本概念,包括其解析、存储结构、常见操作及执行流程,深入理解静态链表在数据结构中的应用。
摘要由CSDN通过智能技术生成

一、解析

对于静态链表,链表就是结点中保存下一个元素的地址。而静态呢就是一个数组保存下个地址的索引位置达到节省空间位置。参考书上P31-P34

二、存储结构

//静态链表
typedef struct{
	ElemType data;
	int cur;//这个cur跟链表的next差不多
}component, SLinkList[MAXSIZE];

三、操作

//======================================静态链表===============
#define MAXSIZE 100//链表的最大长度
//静态链表
typedef struct{
	ElemType data;
	int cur;//这个cur跟链表的next差不多
}component, SLinkList[MAXSIZE];
//空链表的头位置为0;
//int start = -1;//非空链表头 -1代表还没生成
int LocateElem_SL(SLinkList S, ElemType e){
	//在静态链表中查找第1个值为e的元素
	//若找到,则返回它在L中的为序,否则返回0
	return 0;
}

void InitSpace_SL(SLinkList &space){
	//将一维数组space中各分量链成一个备用链表,space[0],cer为头指针 空链的头指针
	for (int i = 0; i < MAXSIZE - 1; i++)
	{
		space[i].cur = i + 1;
		//space[i].data = i + 1;
	}
	space[MAXSIZE - 1].cur = 0;
	//space[MAXSIZE - 1].data = 0;
}

int Malloc_SL(SLinkList &space){
	//若备用空间非空,则返回分配的结点下标,否则返回0
	int i = space[0].cur;//从空链分配下来的一个空的空闲下标
	if (i)
	{
		//如果这个i不等于0的情况 证明空链表还有空间 将这个i分配出去
		//更新空链表的头结点的cur
		space[0].cur = space[i].cur;
		return i;
	}
	//空链表没有空间了
	return 0;
}

void Free_SL(SLinkList &space, int k){
	//将下标为k的空闲结点回收到备用链表 //这里无视了k的合法性
	space[k].cur = space[0].cur;
	space[0].cur = k;
}
void ListDelete_SL(SLinkList &space, int i, int start){
	//删除静态链表的第i个元素 start指明静态链表中元素的首结点
	//这里不做i的非法判断了
	//要删掉第i和位置 先去到第i-1个位置
	int p = space[start].cur;//跳过头结点的第0个元素的位置
	for (int j = 0; j < i - 1; j++)
	{
		p = space[p].cur;
	}
	int k = space[p].cur;
	space[p].cur = space[k].cur;
	Free_SL(space, k);
	//printf("\n第i-1个位置 %d\n",space[p].data);
}
void CreateList_SL(SLinkList &space, int* nums, int size, int &start){
	//创建静态链表 nums是放置的元素 num是放置的元素个数
	InitSpace_SL(space);
	start = Malloc_SL(space);//分配的头结点的位置
	int tail = start;//有数据链表的最后位置
	for (int i = 0; i < size; i++)
	{
		int j = Malloc_SL(space);//分配出的J位置是空闲位置 
		space[j].data = nums[i];
		space[tail].cur = j;
		tail = j;
	}
	space[tail].cur = 0;//尾指针指向空的头
}

void PrintfList_SL(SLinkList &space, int start){
	int i = start;
	if (start == -1)
	{
		//链表中还没元素
		printf("链表中还没元素");
		return;
	}
	while (space[i].cur)
	{
		i = space[i].cur;//移动下个结点
		printf("%d:", space[i].data);
	}
}
void difference(SLinkList lA, SLinkList lB, SLinkList &lC){
	//(A-B)U(B-A)对于算法2.17感觉没什么好说的 书上的写法感觉很乱 用scanf搞事情,我改了下 参数
	//将A集合与B集合进行算法2.17然后保存到lC
}

四、执行

	 //静态链表
	 SLinkList listA;
	 int numsA[4] = { 1, 2, 3, 4 };
	 int startA = -1;
	 CreateList_SL(listA,numsA,4,startA);
	 ListDelete_SL(listA,2,startA);
	 PrintfList_SL(listA,startA);

输出:
1:2:4:请按任意键继续. . .




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值