数据结构--静态链表(C语言实现)


一.静态链表的结构设计:

cpp 复制代码
typedef struct SNode
{
    int data;//数据
   int next;//后继指针(下标)
}SNode,SLinkList[MAXSIZE];

二.静态链表的结构设计示意图


0:有效数据链的头节点;
1:空闲数据链的头节点;


三.静态链表的实现

cpp 复制代码
//初始化
	assert(ps != NULL);
	if (ps == NULL)
		return -1;

	//遍历有效链表
	for (int p = ps[0].next; p != 0; p = ps[p].next)
	{
		if (ps[p].data == key)
		{
			return p;
		}
	}

	return -1;
}

int  GetPrio(SNode* ps, int key)
{
	for (int p = 0; ps[p].next != 0; p = ps[p].next)
	{
		//if (ps[ps[p].next].data == key)//ok
		int q = ps[p].next;//q为p的后继
		if(ps[q].data==key)
		{
			return p;
		}
	}
	return -1;
}


//删除第一个val的值
bool DelVal(SNode* ps, int val)
{
	//获取val的前驱
	int p = GetPrio(ps, val);
	if (p < 0)
		return false;

	//将节点从有效数据链表中剔除
	int q = ps[p].next;
	ps[p].next = ps[q].next;

	//将节点添加到空闲链表中
	ps[q].next = ps[1].next;
	ps[1].next = q;

	return true;
}



//输出
void Show(SNode* ps)
{
	assert(ps != NULL);
	if (ps == NULL)
		return;
	for (int p = ps[0].next; p != 0; p = ps[p].next)
	{
		printf("%d  ", ps[p].data);
	}
	printf("\n");
}

//清空数据
void Clear(SNode* ps)
{
	assert(ps != NULL);
	if (ps == NULL)
		return;
	InitList(ps);
}

//销毁整个内存
void Destroy(SNode* ps)
{
	Clear(ps);
}

四.静态链表的总结

1.静态链表,利用顺序表模拟链表 2.静态链表包含两条链表,一条为有效数据链表,另一条为空闲节点链表 3.有效数据链表为带头结点的循环链表,且头节点在0号下标 4.空闲数据链表为带头结点的循环链表,且头节点在1号下标 5.静态链表的优点:和顺序表对比,插入删除不需要移动数据,O(1) 6.静态链表的优点:和链表对比,不需要频繁的创建和删除节点

7.静态链表的缺点:和顺序表对比,需要增加一个next 8.静态链表可以动态增长,满后扩容,将扩容的内存添加到空闲链表;


本篇完!

相关推荐
代码游侠17 分钟前
学习笔记——数据结构学习
linux·开发语言·数据结构·笔记·学习
蘑菇小白1 小时前
数据结构--链表
数据结构·链表
古译汉书1 小时前
嵌入式笔记(个人总结)
数据结构·笔记·stm32·单片机·嵌入式硬件
不许哈哈哈12 小时前
Python数据结构
数据结构·算法·排序算法
sin_hielo14 小时前
leetcode 2872
数据结构·算法·leetcode
AI科技星15 小时前
为什么宇宙无限大?
开发语言·数据结构·经验分享·线性代数·算法
合方圆~小文16 小时前
AI摄像头精准识别技术依赖于深度算法
数据结构·数据库·数码相机·模块测试
松涛和鸣17 小时前
16、C 语言高级指针与结构体
linux·c语言·开发语言·数据结构·git·算法
FuckPatience19 小时前
C# 实现元素索引由1开始的链表
开发语言·链表·c#
小欣加油20 小时前
leetcode 1018 可被5整除的二进制前缀
数据结构·c++·算法·leetcode·职场和发展