当前位置: 首页 > article >正文

数据结构---顺序表之单链表

1.链表的概念

链表是一种逻辑上是线性的,但物理结构不一定是线性的数据结构,它通过链表中的指针链接次序实现的

链表的存储空间是我们通过动态内存开辟的内存空间,所以他们的地址可能是连续的也可能不是连续的

2.链表的分类

1.单向或者双向

2.带头或者不带头

3.循环或者不循环

虽然链表有这么多种类,单我们常用的就只有两种:

                                               单向不带头不循环链表(单链表)

                                                   双向带头循环链表(双链表)

3.单链表的实现

SList.h

// 1、无头+单向+非循环链表增删查改实现
typedef int SLTDateType;
typedef struct SListNode
{
 SLTDateType data;
 struct SListNode* next;
}SListNode;
// 动态申请一个结点
SListNode* BuySListNode(SLTDateType x);
// 单链表打印
void SListPrint(SListNode* plist);
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x);
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x);
// 单链表的尾删
void SListPopBack(SListNode** pplist);
// 单链表头删
void SListPopFront(SListNode** pplist);
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x);
// 单链表在pos位置之后插入x
// 分析思考为什么不在pos位置之前插入?
void SListInsertAfter(SListNode* pos, SLTDateType x);
// 单链表删除pos位置之后的值
// 分析思考为什么不删除pos位置?
void SListEraseAfter(SListNode* pos);

SList.c

//为什么这里要用二级指针?
//因为我们的头结点是一个结构体指针,我们可能会改变头结点,所以我们需要传结构体地址的地址


// 动态申请一个结点
SListNode* BuySListNode(SLTDateType x) {
	SListNode* NewNode = (SListNode*)malloc(sizeof(SListNode));
	if (NewNode == NULL) {
		return 0;
	}
	NewNode->next = NULL;
	NewNode->data = x;
	return NewNode;
}
// 单链表打印
void SListPrint(SListNode* plist) {
	
	SListNode* pcur = plist;
	while (pcur) {
		printf("%d->", pcur->data);
		pcur = pcur->next;
	}
	printf("NULL\n");
}
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x) {
	assert(pplist);
	SListNode* NewNode = BuySListNode(x);
	//如果链表为NULL,头结点就是NewNode
	if (*pplist == NULL) {
		*pplist = NewNode;
		return;
	}
	//链表不为NULL,找到尾节点插入
	SListNode* pcur = *pplist;
	while (pcur->next) {
		pcur = pcur->next;
	}
	pcur->next = NewNode;
}
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x) {
	assert(pplist);
	SListNode* NewNode = BuySListNode(x);
	SListNode* pcur = *pplist;
	NewNode->next = pcur;
	*pplist = NewNode;
}
// 单链表的尾删
void SListPopBack(SListNode** pplist) {
	assert(pplist);
	//链表为NULL不能执行删除
	assert(*pplist);
	//如果链表只有1个节点
	if ((*pplist)->next == NULL) {
		free(*pplist);
		*pplist = NULL;
		return;
	}
	SListNode* pcur = *pplist;
	SListNode* prev = NULL;
	while (pcur->next) {
		prev = pcur;
		pcur = pcur->next;
	}
	prev->next = pcur->next;
	free(pcur);
	pcur = NULL;
}
// 单链表头删
void SListPopFront(SListNode** pplist) {
	assert(pplist);
	assert(*pplist);
	SListNode* pcur = *pplist;
	*pplist = pcur->next;
	free(pcur);
	pcur = NULL;

}
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x) {
	assert(plist);
	SListNode* pcur = plist;
	while (pcur) {
		if (pcur->data == x) {
			return pcur;
		}
		pcur = pcur->next;
	}
	//未找到返回NULL
	return NULL;
}
// 单链表在pos位置之后插入x
// 分析思考为什么不在pos位置之前插入?
//因为单链表的节点只能找后继结点,不能找前驱
void SListInsertAfter(SListNode* pos, SLTDateType x) {
	assert(pos);
	SListNode* NewNode = BuySListNode(x);
	NewNode->next = pos->next;
	pos->next = NewNode;
}
// 单链表删除pos位置之后的值
// 分析思考为什么不删除pos位置?
// 如果链表存在多个节点,pos节点之前的节点就会丢失,造成内存泄露
void SListEraseAfter(SListNode* pos) {
	assert(pos);
	assert(pos->next);
	SListNode* DeleNode = pos->next;
	pos->next = DeleNode->next;
	free(DeleNode);
	DeleNode = NULL;
}


http://www.kler.cn/news/323495.html

相关文章:

  • 关于 spi 的linux 的驱动的问题
  • Java和C语言语法细节(持续更新中)
  • pytorch ----【输入张量.data.size()/输入张量.size()】的使用
  • 基于MATLAB的虫害检测系统
  • Java实现找色和找图功能
  • 每天一道面试题(20):锁的发生原因和避免措施
  • C++ | 定长内存池 | 对象池
  • 【C语言】动态内存管理:malloc、calloc、realloc、free
  • 每天一道面试题(19):Spring Boot 中自动装配机制的原理
  • IIS开启后https访问出错net::ERR_CERT_INVALID
  • EasyExcel使用介绍
  • 【个人笔记】数据一致性的解决方案
  • 10.C++程序中的循环语句
  • RS485ESD-Enhanced, Fail-safe, Slew-Rate-limited RS-485/RS-422 Transceivers
  • 基于Hive和Hadoop的白酒分析系统
  • 信号处理: Block Pending Handler 与 SIGKILL/SIGSTOP 实验
  • 开关电源要做哪些测试?
  • Docker精讲:基本安装,简单命令及核心概念
  • ①无需编程 独立通道 Modbus主站EtherNet/IP转ModbusRTU/ASCII工业EIP网关串口服务器
  • 染色算法的简单概述
  • altera FPGA下载失败
  • MySQL之基础篇
  • 【bug fixed】hexo d的时候Spawn failed
  • c语言200例 066
  • Spring Boot实战:构建在线商城系统
  • PyQt5中关于QLineEdit的空输入报错的简单处理
  • 华为云发布全栈可观测平台AOM,以AI赋能应用运维可观测
  • Apache Cordova/PhoneGap
  • ConstructorParameters
  • 基于elasticsearch存储船舶历史轨迹