C语言链表

C语言实现单向链表 本章使用C语言实现了数据结构中的单向链表,难度也不高,但值得作为学习数据结构的人去亲自实现一下。 阅读详情

目录

首先讲解一下什么是链表

数组与链表的区别

定义链表

链表的扩容

链表的尾插

链表的头插

链表的尾删

 链表的头删

链表的查找

 链表的任意位置插入(在pos位置之前插入)

链表的任意位置删除(删除pos位置的值)

链表的任意位置插入(在pos位置之后插入)

链表的任意位置删除(删除pos位置之后的值)


首先讲解一下什么是链表

这里大家可以看一下这张图,这便是链表的大致结构

这张图描述了链表的内部结构

 从上图可知,可以定义一个结构,一部分存放数据,一部分指下一个节点的指针,这就构成了单链表

当然如果增加指向上一节点的指针,就变成双链表

当然这里我主要为大家讲解一下单链表,双链表其实同理

数组与链表的区别

数组:空间连续,大小固定,要么不够用,要么浪费

链表:空间不连续,大小可根据动态变化

定义链表

typedef int SLTDataType;

typedef struct SListNode
{
	SLTDataType data;
	struct SListNode* next;
}SLTlist;

 这里使用了(typedef int SLTDataType;)这是为了到时链表里存的不是int类型,方便修改

链表的扩容

SLTlist* buySLTlist(SLTDataType x)
{
	SLTlist* newnode = (SLTlist*)malloc(sizeof(SLTlist));
	assert(newnode);
	newnode->data = x;
	return newnode;
}

这里为什么要把这的函数放在最前面,因为扩容会在后面被其他函数调用,所以把它放在最前面。

链表的尾插

void SListPushBack(SLTlist** pphead, SLTDataType x)
{
	SLTlist* newnode = (SLTlist*)malloc(sizeof(SLTlist));
	assert(newnode);
	newnode->data = x;
	newnode->next = NULL;
	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	else
	{
		SLTlist* tail = *pphead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		tail->next = newnode;
	}
	return;

 当然看代码有点难理解,下面我用图画演示一遍

假如要在这后面加入一个node4节点,可按如下操作

链表的头插

void SListpushfrond(SLTlist** pphead, SLTDataType x)
{
	SLTlist* newnode=buySLTlist(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

头插就非常简单,当然我也会用图给大家演示一下

现在我们要将node4插在头上,可以如下操作(就是只用将node4指向头指针,然后将头指针更新为node4,就可以了)

 下面进入链表的删除

链表的尾删

void SListPopBack(SLTlist** pphead)
{
	SLTlist* cur = *pphead;
	if (cur==NULL)
	{
		printf("链表为空\n");
		return;
	}
	if (cur->next == NULL)
	{
		free(*pphead);
		*pphead = NULL;
		return;
	}
	while (cur->next->next!= NULL)
	{
		cur = cur->next;
	}
	free(cur->next);
	cur->next = NULL;	
}

图片演示

 这个其实就是先要找到尾节点的前一个,然后让尾节点的前一个指向空

 链表的头删

void SListpushfrond(SLTlist** pphead)
{
	SLTlist* cur = *pphead;
	if (cur== NULL)
	{
		printf("链表为空\n");
		return;
	}
	*pphead = (*pphead)->next;
	free(cur);
	return;
}

 

 头删其实更简单,只需要将头指针更新为原头指针指向的下一个,就是说把头指针更新为node2

链表的查找

SLTlist* SListfind(SLTlist* phead, SLTDataType x)
{
	SLTlist* cur = phead;
	while (cur)
	{
		if (cur->data == x)
			return cur;
		cur = cur->next;
	}
	return 0;
}

 链表的任意位置插入(在pos位置之前插入)

void SListInset(SLTlist** pphead, SLTlist* pos, SLTDataType x)
{
	assert(pos);
	assert(pphead);
	if (pos == *pphead)
	{
		SListpushfrond(&(*pphead),x);
		return;
	}
	SLTlist* newnode = buySLTlist(x);
	SLTlist* cur = *pphead;
	while (cur->next != pos)
	{
		cur = cur->next;
	}
	cur->next = newnode;
	newnode->next = pos;
	return;
}

图片演示

 这个的思路其实是,首先找到pos的前一个结点,然后使其指向node2,并使node2指向pos

链表的任意位置删除(删除pos位置的值)

void SListErase(SLTlist** pphead, SLTlist* pos)
{
	if (pos == *pphead)
	{
		SListpushfrond(&(*pphead));
		return;
	}
	SLTlist* cur = *pphead;
	while (cur->next != pos)
	{
		cur = cur->next;
	}
	SLTlist* tail = cur->next;
	cur->next = cur->next->next;
	free(tail);
	return;
}

 图片演示

思路是使pos的前一个节点 指向pos的后一个节点

链表的任意位置插入(在pos位置之后插入)

void SListInsetAfter(SLTlist** pphead, SLTlist* pos, SLTDataType x)
{
	assert(pos);
	SLTlist* newnode = buySLTlist(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

这个其实和上面的那个相似,并且更加简单

 

链表的任意位置删除(删除pos位置之后的值)

void SListEraseAfter(SLTlist** pphead, SLTlist* pos)
{
	assert(pphead);
	assert(pos->next);
	SLTlist* cur = pos->next;
	pos->next = pos->next->next;
	free(cur);
	return;
}

到这里单链表的基本功能基本实现,如有不当,欢迎大家提出!!! 

C语言来实现链表创建 前言 链表是数据结构中很重要的内容,要想学会数据结构,首先要了解链表 链表的基本知识 1,链表的构成 链表是由一个头指针和一个个节点构成的,如图: 而节点则是一个个结构体,包含数据域和指针域两部分,其中,指针域存储的是指向下一个节点的指针 2,对于链表的操作 1,创建链表 2,初始化链表 3,遍历链表 4,对于链表进行增删查等操作 C语言对于链表的代码的实现 1,创建结构体并命名 创建链表前需要先创建结构体作为节点和头指针: typedef struct Node //typedef方法函数可以对于st 阅读详情

相关推荐

【C语言】链表

本篇文章将详细讲到有关链表的概念,链表节点,链表分类,链表的基本操作包括初始化链表,遍历链表,插入节点,删除节点,清空链表,销毁链表。

2301_80035097的博客 1055

C语言——链表

C语言——链表 链表是一种基础的数据结构类型,一种能够动态维护数据的线性数据表。链表的数据以结点形式存储信息,并通过结点之间的指针实现结点之间的衔接。 为什么要用链表? 链表和数组类似,但是功能比数组强大得多,数组的空间是固定的,在定义数组的时候,数组的大小已经被固定,在使用时有可能会造成空间的浪费或者面临空间不够的风险,而链表的空间是动态的,则避免了这一问题。 我们来看最基础的单向链表: 1.首先要定义结构体作为链表的结点: typedef struct node { int data; struct

m0_62386635的博客 2万+

c语言—链表

就是数据结构 -> 数据存放(集合)的思想数组 :每一个元素的地址是连续的。这个空间就等于 4*10 = 40个字节。1个字符 4个字节.结构体:每一个元素struct a {int a ,b;这个结构体空间就是16个字节 8*2;一个字符 8个字节。不管是数组,还是结构体,他们无法的 其中的数据进行增加、删除和,因为地址是连续的。

2301_79405674的博客 3181

C语言 动态链表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言项目场景:问题描述:原因分析:解决方案:一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 大家好~在学习C语言的过程中,动态链表的创建总是会把我弄得有点晕(思路是有的,但是写完代码之后就很容易出错,于是今天想把我在链表创建过程中出现的问题给大家分享一下,也希望大家以后遇到了相关问题就) 项目场景: 提示:这里简述项目相关背景: 例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s

张小婷的博客 1万+

二维链表,C语言

大概相当于二维数组,主链表存行,子链表存列 #include <stdio.h> #include <stdlib.h> #include <string.h> #define success 0 #define fail -1 typedef struct infoin//子链信息 { int row; } infoin; typede...

weixin_45246477的博客 3409

C语言链表操作详解

为什么要使用链表 在未学习链表时,我们常用的存储数据的方式无非就是数组。使用数组存储数据的好处就是查询快,但是它的弊端也很明显: 使用前需声明数组的长度,一旦声明长度就不能更改 插入和删除操作需要移动大量的数组元素,效率慢 只能存储一种类型的数据. 而链表则可以实现以上这些数组所不具备的功能,此时引入了结构体来实现创建链表的操作。 链表的特点: n个节点离散分配 每一个节...

qq_41481924的博客 14万+

C语言链表详解附实例

链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。链表和数组比较,不用事先确定存储空间,而是根据需要开辟内存单元。本文章实现了用C语言编写学生管理系统,可以实现添加、删除、增加..,等功能

xiaoxiaodawei的博客 2万+

告别USB转接:在STM32探索板上用SPI跑通ESP-Hosted,实现Wi-Fi/BLE连接

本文详细介绍了如何在STM32F469I-DISCO开发板上通过SPI接口实现ESP-Hosted方案,为嵌入式设备添加Wi-Fi和蓝牙连接功能。通过硬件配置、协议栈优化和性能测试,展示了这一创新方案的成本效益和开发效率,特别适合资源受限但需要稳定无线连接的嵌入式应用场景。

weixin_34046298的博客 252

链表的C语言实现

一、单向链表的C语言实现 链表作为一种基本的数据结构在程序开发过程当中经常会使用到。对C语言来说链表的实现主要依靠结构体和指针,所以本文相关内容和程序需要有C语言当中指针和结构体的基础。 链表是一种线性存储数据的结构,存储内容在逻辑上连续的,在物理上却不一定连续。单向链表的组成包括一个链表头(head)和若干链表元素(node),对链表的基本操作其实就是增、删、改、查。 首先说说单向链表的C语言实...

weixin_43667308的博客 4万+

BALM2深度解析 | 港大MARS实验室如何用点簇革新激光BA?

本文深度解析了港大MARS实验室提出的BALM2方案如何通过点簇技术革新激光BA(Bundle Adjustment)处理。BALM2将点云数据聚合为点簇,显著提升计算效率,实测显示其计算耗时仅为传统方法的1/20。文章详细介绍了点簇的核心原理、二阶优化方法及与传统方法的性能对比,展示了其在激光SLAM领域的突破性应用。

weixin_29212867的博客 153

lstm如何输入多维序列_深度学习也可以做时间序列异常诊断

最近在看的一篇论文里,用到了GRU、VAE等技术来做多维时间序列异常诊断。那么今天首先来聊一聊深度学习的基础知识,然后简单说一下论文。以下基础知识部分的内容,主要来源于李宏毅老师的课程。有兴趣的可以去看李老师的课程哦https://www.bilibili.com/video/BV1JE411g7XF?p=1 1、GRU(Gate Recurrent Unit):GRU是循环神经网络(Recurr...

weixin_30899789的博客 2833

C语言链表超简单教程

笔者作为一名C语言的初学者,在刚接触链表时,几乎找不到教程能用很通俗易懂的语言去讲解链表。大多数时候找到的关于链表的教程,或许是生硬的塞给读者一大段代码,或许是使用了一些过于专业的词汇,对于萌新非常地不友好。这就是我写这篇教程的原因。好吧,即使这篇教程会相对简单,但是在阅读之前,读者还是需要首先简单了解结构体部分和指针部分的内容。好,那我们就开始吧。首先通俗地解释一下:链表是一种特殊的结构体,创建...

Kitaibel的博客 7万+

DDR5内存命令真值表详解:如何正确解析JESD79-5标准中的关键指令

本文深度解析JESD79-5标准中的DDR5内存命令真值表,将其视为动态通信协议进行拆解。详细阐述了1-Cycle与2-Cycle命令的区别、Bank Group寻址机制以及模式寄存器(MR)操作流程,为硬件与固件工程师提供了从信号解析到系统调试的完整实战指南,是理解和优化高性能计算平台内存子系统的核心。

numpy6sculptor的博客 548

C语言 链表

int data;int data;} Node;上面,我们定义了链表类型,那么我们如何创建链表变量呢,一般采用以下几步:通过调试器可以看到每个数据都是相互连接的。

m0_68484018的博客 4919

一个 ABAP 工具,能打印系统里某个用户对 BSP 应用的浏览历史记录

只要一个用户在 SAP ABAP 系统里浏览过 BSP 页面,会留下浏览历史记录。本工具会解析出这些记录,打印出该用户浏览的历史事件,和浏览过的页面名称。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 546

AI人工智能代理工作流 AI Agent WorkFlow:在股票市场预测中的应用

AI人工智能代理工作流 AI Agent WorkFlow:在股票市场预测中的应用 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 关键词: AI Agent, W

AI天才研究院 859

C语言创建链表

C语言创建链表 一、链表中结点的存储        链表的结点左边一部分是存放的数据,右边一部分是后继指针指向下一个结点的地址。C语言中通常定义一个结构体类型来存储一个结点,如下: struct node { int data; struce node *next; //下一个结点的类型也是struct...

Black_黑色的博客 2万+

Vue3 - Element Plus 表格组件 el-table “表格行数据中又嵌套了二维对象数组“,按平级循环渲染(嵌套数组视为同级行数据), 对嵌套的数组循环展示为表格,智能合并行或列详细教程

vue3,nuxt3,element-plus,table表格组件,el-table,vue3element表格组件,数据中有二维数组怎么遍历循环显示,表格数据带二级数组怎么循环渲染显示,表格数据中存在一个数组要怎么才能显示到表格,el-table表格合并详细教程示例,table表格如果对象里面还有对象数组那该怎么去渲染,平常都是数组中一个对象渲染成一行,每行中还有嵌套数组怎么办,每个行数据下还有一个数组怎么显示,怎么把表格相同的数据合并为一行,合并上下两行相同数据单元格,合并行或列如果遇到相同单元格就合

🏆 前端领域优质创作者 1万+

C语言 —— 链表简学

C语言 —— 链表简学链表创建简单链表 链表 链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。 链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。 链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部...

V1040375575的博客 2678

Unity-TextMeshPro如何扩展材质实现字体Face+Outline流光效果

前言 TexeMeshPro 是Unity的一个Text文本插件,实现了比UGUI的Text,更好看的效果,跟高效的性能,所以深受大家的喜欢,但是再好的插件,也不是万能的,比如我们的策划有个新需求,要我们的VIP的名字比普通玩家有更好看的效果,例如:字体流光,外发光颜色扰动,字体贴图等等。那我们就需要去扩展TextMeshPRo的shader功能了。如下图所示 本文,我就带大家一起来扩展一下:如何扩展TextMeshProUGUI TextMesh原始面板 扩展功能后的面板 扩展TextMeshPro

TxNet 9675

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【C语言】深入理解C语言链表

链表是一种常见的数据结构,广泛应用于计算机科学中。C语言提供了丰富的指针操作,使得链表的实现相对简便。本博客将介绍链表的基本概念,以及使用C语言实现链表的代码示例。

Goforyouqp的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

c语言的链表,C语言链表详解

前言学习链表之前,先来看几个术语:首节点:存放第一个有效数据的节点;尾节点:存放最后一个有效数据的节点;头节点:头节点的数据类型与首节点的数据类型相同,并且头节点是首节点前面的那个节点,并不存放有效数据;头节点的存在只是为了方便链表的操作。头指针:指向头节点的指针;尾指针:指向尾节点的指针。链表的基本操作1. 节点的构造#include #include #include #define LEN ...

weixin_42176827的博客 4052

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C语言-链表

欢迎来到HanLop博客的C语言数据结构初阶系列。在这个系列中,我们将深入探讨各种基本的数据结构和算法,帮助您打下坚实的编程基础。本次我将为你讲解链表。链表是一种线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。由于其灵活的内存分配方式,链表在动态数据存储和处理方面有着独特的优势。在本篇文章中,我们将介绍链表的基本概念、链表的创建和操作方法,以及其优缺点。通过一些实际的代码示例,您将更好地掌握链表在C语言中的应用,从而为后续学习其他数据结构打下坚实的基础。

m0_73605503的博客 1653
上一篇: c语言顺序表
下一篇: C语言栈实现
pythoncjavac++
博客等级 码龄5年 718粉丝 71原创
评论 20
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pythoncjavac++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值