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


本篇完!

相关推荐
随意起个昵称10 分钟前
【贪心】选择尽量多的不相交区间
数据结构·算法
章小幽20 分钟前
LeetCode-35.搜索插入位置
数据结构·算法·leetcode
j_xxx404_1 小时前
C++算法:一维/二维前缀和算法模板题
开发语言·数据结构·c++·算法
Book思议-2 小时前
顺序表和链表核心差异与优缺点详解
java·数据结构·链表
whn19774 小时前
在sqllog中排查达梦阻塞会话
数据结构
01二进制代码漫游日记4 小时前
C/C++中的内存区域划分
c语言·jvm·数据结构·学习
xiaoye-duck4 小时前
《算法题讲解指南:优选算法-链表》--51.两数相加,52.两两交换链表中的节点
数据结构·算法·链表
代码改善世界4 小时前
【数据结构】八大排序算法详解(C语言实现)|插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序
c语言·数据结构·排序算法
2501_940315265 小时前
98验证二叉搜索树
java·数据结构·算法
仰泳的熊猫5 小时前
题目2266:蓝桥杯2015年第六届真题-打印大X
数据结构·c++·算法·蓝桥杯