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

单链表的实现(C语言)

目录

1.单链表

1.1 实现单链表

1.1.1 文件创建

1.1.2 链表功能了解

1.1.3 链表的结点

1.1.4 链表的函数声明

1.1.5 链表功能的实现


链表是一种链式结构,物理结构不连续,逻辑结构是连续的,在计算机中链表的实际存储是按照一个结点内存放下一个结点的地址来实现链接的

1.单链表

单链表也称不带头无循环单向链表

链表的概念相信大家都了解,说的再多不如自己实现一个链表来的理解深入

我们现在开始手搓一个单链表出来

1.1 实现单链表

1.1.1 文件创建

首先我们创建一个头文件slist.h,用来包含头文件和函数的声明

再创建一个源文件slist.c,用来函数的实现

最后创建一个main.c来测试我们的单链表功能

这样我们的代码耦合性会更高,以后哪里需要单链表去完成什么功能直接使用当前的文件就可以了

好了!现在我们可以开始愉快的写代码了

1.1.2 链表功能了解

  1. 单链表的申请元素
  2. 单链表的初始化
  3. 单链表的头部插入删除
  4. 单链表的尾部插入删除
  5. 单链表的pos位置之后的插入删除
  6. 单链表的打印元素

好了了解这些功能建议不要立即去抄代码,而是自己带着功能去自己试着实现,这样理解的更深刻

1.1.3 链表的结点

单链表只保存下一个结点的地址,所以结点是很简单的

#pragma once
#include<stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SListNodeDataType; //将需要存入链表的元素类型typedef,代码耦合性变低
typedef struct SListNode	//将链表结点类型typedef为Slist
{
	SListNodeDataType _val;	//链表保存的数据
	struct SListNode* _next;//链表的下一个结点的地址
}SList;

1.1.4 链表的函数声明

SList* CreateSLNode(SListNodeDataType val);	//创建新结点
void SListPushBack(SList** st, SListNodeDataType val);//尾插
void SListPopBack(SList** st);//尾删
void SListPushFront(SList** st, SListNodeDataType val);//头插
void SListPopFront(SList** st);//头删
void SListInsert(SList** pos, SListNodeDataType val);//pos位置之后的插入
void SListErase(SList** pos);//pos位置之后的删除
void SListPrint(SList* st);//打印链表元素

这些都是存放在slist.h中的

将函数的实现放在slist.c中

1.1.5 链表功能的实现

#include"slist.h"

SList* CreateSLNode(SListNodeDataType val)
{
	SList* newNode = (SList*)malloc(sizeof(SList));
	assert(newNode);
	newNode->_next = NULL;
	newNode->_val = val;
	return newNode;
}
void SListPushBack(SList** st, SListNodeDataType val)
{
	if (*st == NULL)
	{
		*st = CreateSLNode(val);
		return;
	}
	SList* cur = *st;
	while (cur->_next)
	{
		cur = cur->_next;
	}
	cur->_next = CreateSLNode(val);
}
void SListPopBack(SList** st)
{
	assert(*st);
	SList* cur = *st;
	SList* prev = *st;
	while (cur->_next)
	{
		prev = cur;
		cur = cur->_next;
	}
	free(cur);
	prev->_next = NULL;
}
void SListPushFront(SList** st, SListNodeDataType val)
{
	SList* newNode = CreateSLNode(val);
	newNode->_next = *st;
	*st = newNode;
}
void SListPopFront(SList** st)
{
	assert(*st);
	SList* cur = *st;
	*st = cur->_next;
	free(cur);
}
void SListInsert(SList** pos, SListNodeDataType val)
{
	assert(*pos);
	SList* newNode = CreateSLNode(val);
	SList* cur = *pos;
	newNode->_next = cur->_next;
	cur->_next = newNode;
	
}
void SListErase(SList** pos)
{
	assert(*pos);
	SList* cur = *pos;
	SList* tmp = cur->_next;
	if (cur->_next)
	{
		cur->_next = cur->_next->_next;
	}
	free(tmp);
}
void SListPrint(SList* st)
{
	SList* cur = st;
	while (cur)
	{
		printf("%d ", cur->_val);
		cur = cur->_next;
	}
	printf("\n");

}


http://www.kler.cn/a/300529.html

相关文章:

  • 实践深度学习:构建一个简单的图像分类器
  • Apache Hive--排序函数解析
  • Spring Boot + Apache POI 实现 Excel 导出:BOM物料清单生成器(支持中文文件名、样式美化、数据合并)
  • Linux高级--3.3.1 C++ spdlog 开源异步日志方案
  • 微信小程序
  • 2024年度个人成长与技术洞察总结
  • MongoDB高可用和分片集群知识
  • 火语言RPA流程组件介绍--鼠标拖拽元素
  • Node.js运行环境搭建
  • 算法题:找出1到1亿中“只有一个重复的”自然数
  • Flask中的钩子函数
  • SpringCloud之配置中心svn示例和refresh
  • go-mciro系列(四)使用nacos作为配置中心_go使用nacos
  • 【无人机设计与控制】固定翼四旋翼无人机UAV俯仰姿态飞行模糊自整定PID控制Simulink建模
  • 大模型的实践应用29-大语言模型的RLHF(人类反馈强化学习)的具体应用与原理介绍
  • 分布式集群下如何做到唯一序列号
  • rhel 8.6 开箱基本设置
  • Python3网络爬虫开发实战(14)资讯类页面智能解析
  • 【大数据算法】一文掌握大数据算法之:空间亚线性算法。
  • windows和linux安装mysql5.7.31保姆级教程
  • C/C++程序的内存开辟
  • MySQL数据库 — Explain命令
  • hadoop分布式搭建
  • 贪心算法day29|134. 加油站(理解有难度)、135. 分发糖果、860. 柠檬水找零、406. 根据身高重建队列
  • 最佳实践-模板设计模式
  • 横版闯关手游【全明星时空阿拉德】Linux手工服务端+运营后台+双app端