数据结构--静态链表(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.静态链表可以动态增长,满后扩容,将扩容的内存添加到空闲链表;


本篇完!

相关推荐
一匹电信狗16 分钟前
【C++】手搓一个STL风格的vector容器
c语言·数据结构·c++·算法·leetcode·stl·visual studio
小小小白的编程日记28 分钟前
C语言中的数据结构--栈和队列(2)
c语言·数据结构
南清的coding日记1 小时前
算法详细讲解- 快速排序与归并排序
数据结构·排序算法
dudly3 小时前
Python 列表内存存储本质:存储差异原因与优化建议
开发语言·数据结构·python·编程语言·内存分析
草莓熊Lotso7 小时前
【数据结构初阶】--二叉树(二)
c语言·数据结构·经验分享·其他
朝朝又沐沐11 小时前
算法竞赛阶段二-数据结构(36)数据结构双向链表模拟实现
开发语言·数据结构·c++·算法·链表
艾莉丝努力练剑13 小时前
【数据结构与算法】数据结构初阶:详解排序(二)——交换排序中的快速排序
c语言·开发语言·数据结构·学习·算法·链表·排序算法
科大饭桶13 小时前
数据结构自学Day13 -- 快速排序--“前后指针法”
数据结构·算法·leetcode·排序算法·c
设计师小聂!15 小时前
力扣热题100----------53最大子数组和
java·数据结构·算法·leetcode
YouQian77216 小时前
问题 C: 字符串匹配
c语言·数据结构·算法