c语言单向链表
看如下代码,这是一个完整的可运行的c源文件,要注意的点:
- c语言程序运行不一定需要头文件
- NULL其实是 (void*)0,把指针赋值成(void*)0,就是防止程序员不想该指针被引用的时候被引用,引用地址为0的值程序会引起系统中断,程序会异常终止
- 可能会有人觉得,别人讲链表都是malloc,怎么这里没有malloc,malloc是用来申请内存的,比较灵活,可以自由改变链表长度,这里用赋值的方法是因为从最简单的开始讲,更能讲清楚原理
#define NULL (void*)0
struct list{int num;/*单向链表需要一个结构体指针指向下一个节点的地址,如果是尾巴节点,则是NULL*/struct list *next;
};
int main()
{struct list n0 = {100, NULL};struct list n1 = {29, NULL};struct list n2 = {78, NULL};struct list n3 = {24, NULL};n0.next = &n1;n1.next = &n2; // 等价 n0.next->next = &n2n2.next = &n3; // 等价 n0.next->next->next = &n3return 0;
}
我们先执行完main函数里面前四句赋值语句,
用gdb查看n0, n1, n2, n3的地址,如下,他们的地址都是不一样的,因为他们在内存的不同的地方,他们也没有什么关系(你们运行出来的内存地址应该和我的不一样,无需产生疑惑)

他们在你的内存条里像这样分布,没什么特点,就是四个结构体,他们占用的大小一样,都是sizeof(struct list)

我们再查看他们的值,都是初始化的值,没错

执行 n0.next = &n1;
就是把n1的地址挂在n0的尾巴上(next指针),这样就可以通过n0.next来表示&n1,查看n0.next,发现变成了n1的地址

执行 n1.next = &n2;和 n2.next = &n3
经过上面的解释,这两句应该很好理解,就是把n2的地址挂在n1的next上,n3的地址挂在n2的next上,现在,就组成了一个简单的链表,就可以通过结构体n0(通常称之为头节点)访问这个链表上的任何数据



使用malloc申请内存的方式创建链表
#include <stdlib.h>
struct list{int num;struct list *next;
};
int main()
{struct list *tmp_node;struct list *head = (struct list*)malloc(sizeof(struct list));head->num = 10;head->next = NULL;/*添加节点*/tmp_node = (struct list*)malloc(sizeof(struct list));tmp_node->num = 3;tmp_node->next = NULL;head->next = tmp_node;/*添加节点*/tmp_node = (struct list*)malloc(sizeof(struct list));tmp_node->num = 5;tmp_node->next = NULL;head->next->next = tmp_node;/*添加节点*/tmp_node = (struct list*)malloc(sizeof(struct list));tmp_node->num = 80;tmp_node->next = NULL;head->next->next->next = tmp_node;return 0;
}
这段代码并不难看懂,就是创建一个节点,然后挂在head的尾巴上,可是这里有缺陷,就是每次都要自己记住有几个节点,然后用 head->next->next->next = tmp_node;的语句去接上节点,这样太麻烦了,我们可以再创建一个尾节点,来表示这个链表的尾巴节点。
#include <stdlib.h>
struct list{int num;struct list *next;
};
int main()
{struct list *tmp_node;struct list *head = (struct list*)malloc(sizeof(struct list));head->num = 10;head->next = NULL;/*刚开始头就是尾,这个能理解吧*/struct list *tail = head;/*添加节点*/tmp_node = (struct list*)malloc(sizeof(struct list));tmp_node->num = 3;tmp_node->next = NULL;tail->next = tmp_node; //接到尾巴上tail = tail->next; //因为后面有新的节点,尾巴要更新位置了,移到新节点了/*添加节点*/tmp_node = (struct list*)malloc(sizeof(struct list));tmp_node->num = 5;tmp_node->next = NULL;tail->next = tmp_node;tail = tail->next;/*添加节点*/tmp_node = (struct list*)malloc(sizeof(struct list));tmp_node->num = 80;tmp_node->next = NULL;tail->next = tmp_node;tail = tail->next;return 0;
}
记住两点:
- 头节点一般不移动
- 每一次操作完毕后,尾节点都是指向最后一个节点的地址
取下/删除链表节点
增加链表节点
插入链表节点
待更新
相关文章:
c语言单向链表
看如下代码,这是一个完整的可运行的c源文件,要注意的点: c语言程序运行不一定需要头文件NULL其实是 (void*)0,把指针赋值成(void*)0,就是防止程序员不想该指针被引用的时候被引用,引用地址为0的值程序会引起系统中断&…...
『番外篇三』Swift “乱弹”之带索引遍历异步序列(AsyncSequence)
概览 在 Swift 开发中,我们往往在遍历集合元素的同时希望获得元素对应的索引。在本课中,我们将向小伙伴们展示除 enumerated() 方法之外的几种实现思路。在玩转普通集合之后,我们将用“魔法棒”进一步搞定异步序列带索引遍历的实现。 在本篇博主中,您将学到以下内容: 概…...
学习JVM
java虚拟机 流程:helloworld.java----(javac编译)----helloworld.class-------(java运行)——JVM——机器码JVM功能 *解释和运行 *内存管理 *即时编译(跨平台-慢一点)jit (反复用到的代码 解释保存再内存里面)…...
Oracle MongoDB
听课的时候第一次碰到,可以了解一下吧,就直接开了墨者学院的靶场 #oracle数据库 Oracle数据库注入全方位利用 - 先知社区 这篇写的真的很好 1.判断注入点 当时找了半天没找到 看样子是找到了,测试一下看看 id1 and 11 时没有报错 2.判断字段…...
Linux-RedHat系统-安装 中间件 Tuxedo
安装步聚 一、中间件安装包: tuxedo121300_64_Linux_01_x86 Tuxedo下载地址: Oracle Tuxedo Downloads 二、新建用户: (创建Oracle用户时,需要root权限操作) 创建用户: # useradd oracle …...
PHP中的依赖注入是怎样的?
依赖注入(Dependency Injection,DI)是一种设计模式,它用于解耦组件之间的依赖关系,提高代码的可维护性、可测试性和灵活性。在 PHP 中,依赖注入通常通过构造函数注入、方法注入或属性注入来实现。 以下是依…...
Python求小于m的最大10个素数
为了找到小于m的最大10个素数,我们首先需要确定m的值。然后,我们可以使用一个简单的算法来检查每一个小于m的数字是否是素数。 下面是一个Python代码示例,可以找到小于m的最大10个素数: def is_prime(n): if n < 1: …...
系统的安全性设计
要设计一个安全的系统,除了要了解一些前面讲到的常用的保护手段和技术措施外,还要对系统中可能出现的安全问题或存在的安全隐患有充分的认识,这样才能对系统的安全作有针对性的设计和强化,即“知己知彼,百战百胜”。 下…...
美容店预约小程序搭建指南
随着互联网的发展,越来越多的传统行业开始尝试将业务与互联网相结合,以提供更加便捷、高效的服务。美容行业也不例外。本文将通过使用第三方制作平台,如乔拓云网,指导您如何搭建一个美观实用的美容店预约小程序,帮助您…...
AI:ElasticSearch
ElasticSearch是一款开源的分布式搜索引擎和数据分析引擎,主要用于处理海量数据并提供近实时的搜索和分析功能。它具有全文检索、结构化检索和数据分析等特点,能够满足各种复杂的搜索需求。ElasticSearch使用Java编写,可以运行在多个服务器上…...
如何用 Python 代码打包成一个可执行的 exe 文件?
将Python代码打包成可执行的EXE文件通常需要使用第三方工具,其中PyInstaller是一个流行的选择。PyInstaller可以将Python脚本打包成独立的可执行文件,无需用户安装Python解释器。 打包Python代码成EXE文件的步骤 步骤1:安装PyInstaller 首…...
【Hive】——CLI客户端(bin/beeline,bin/hive)
1 HiveServer、HiveServer2 2 bin/hive 、bin/beeline 区别 3 bin/hive 客户端 hive-site.xml 配置远程 MateStore 地址 XML <?xml version"1.0" encoding"UTF-8" standalone"no"?> <?xml-stylesheet type"text/xsl" hre…...
简约大气视频制作模板PR剪辑素材PR项目工程文件
Premiere Pro模板,简约大气视频剪辑素材PR项目工程文件(包含手机竖屏分辨率),包含24个媒体占位符和9个文本占位符。可以编辑和自定义文本占位符和媒体占位符。用来展示照片视频制作。包含视频教程。 来自PR模板网:http…...
Guarded Suspension(担保挂起)设计模式
当线程访问某个对象时,发现条件不满足,暂时挂起等待条件满足时再次访问。Guarded Suspension模式是一个非常基础的模式,主要关注(临界值)不满足时将操作的线程正确挂起,以防止出现数据不一致或者操作超过临…...
禾匠榜店商城系统 RCE漏洞复现
0x01 产品简介 禾匠榜店商城系统是浙江禾匠信息科技有限公司的一套基于PHP和MySQL的商城系统。 0x02 漏洞概述 禾匠榜店商城系统的api/testOrderSubmit模块下的preview方法存在命令执行漏洞,攻击者可以向服务器写入木马文件,直接获取服务器权限 0x03 漏洞概述 FOFA:bod…...
Python移动未标注的图片数据集
Python移动未标注的图片数据集 前言前提条件相关介绍实验环境Python移动未标注的图片数据集情况一:有图,无标注文件代码实现输出结果 情况二:有图,有标注文件,但标注信息为空代码实现输出结果 情况一与情况二同时都考虑…...
判断css文字发生了截断,增加悬浮提示
示例: 固定显示宽度,溢出显示...,利用了css的属性,想要实现成下面这样: 针对溢出的文字,hover显示全部。 提示很好加,使用tooltip组件就行了,难点是如何判断是否发生了文字溢出。…...
day33-37-SpringBootV12(整合Spring,SpringMVC,Mybatis,日志,api测试等框架)
ssm spring --> applicationContext.xml配置文件 springmvc --> springmvc.xml配置文件 mybatis —> mybatis-config.xml配置文件 —> springboot优化了之前的框架配置,思想是约定大于配置 一、引言 1.1 初始化配置 为了使用SSM框架去开发,准备SSM…...
如何处理好面试中的“压力测试”?
作为一名求职者,在面试时有时遇到的是压力测试,有时则遇到的是一些无良企业单位,究竟如何把握忍耐的限度,才合格当一个能经受压力的员工,才能避免对无良单位的一味隐忍! 压力面试是指有意制造紧张,以了解求…...
大数据----31.hbase安装启动
二.Hbase安装 先前安装: Zookeeper 正常部署 首先保证 Zookeeper 集群的正常部署,并启动之。 三台机器都执行:zkServer.sh startHadoop 正常部署 Hadoop 集群的正常部署并启动。 主节点上进行 :start-all.sh 1.HBase 的获取 一定…...
用C++和libmodbus库封装一个可复用的Modbus客户端类(TCP/RTU双模式)
用C和libmodbus库封装可复用的Modbus客户端类(TCP/RTU双模式) 在工业自动化和物联网项目中,Modbus协议因其简单可靠的特点成为设备通信的事实标准。但每次新项目都要从头实现底层通信逻辑,不仅效率低下,还容易引入重复…...
OpenCrow:自托管多智能体AI平台的架构解析与实战部署指南
1. 项目概述:一个能自我进化的多智能体AI平台如果你和我一样,对AI智能体的潜力感到兴奋,但又对市面上那些要么功能单一、要么部署复杂的平台感到头疼,那么OpenCrow的出现,可能就是我们一直在等的那个“瑞士军刀”。这不…...
Axure RP中文语言包终极指南:从英文界面到完美汉化的三步解决方案
Axure RP中文语言包终极指南:从英文界面到完美汉化的三步解决方案 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn Ax…...
终极指南:5分钟快速免费解锁Cursor AI编程助手Pro功能完整教程
终极指南:5分钟快速免费解锁Cursor AI编程助手Pro功能完整教程 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached …...
Strassen多脉动阵列架构:矩阵乘法硬件加速新方案
1. Strassen多脉动阵列架构解析:当算法优化遇上硬件设计矩阵乘法作为计算机科学中最基础的运算之一,其性能直接影响着机器学习、图像处理等众多领域的计算效率。传统矩阵乘法的时间复杂度为O(n),而Strassen算法通过分治策略将这个复杂度降低到…...
OBS Multi RTMP:打破平台壁垒的一站式直播解决方案
OBS Multi RTMP:打破平台壁垒的一站式直播解决方案 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 在当今多平台直播成为主流趋势的时代,主播们常常面临一个技术…...
为AI助手打造企业级FTP/SFTP操作引擎:告别重复脚本,实现智能文件部署
1. 项目概述:为AI助手量身打造的FTP/SFTP操作引擎如果你和我一样,经常让AI助手(比如Claude、Cursor、Windsurf)帮忙写代码、部署项目,那你肯定遇到过这个让人哭笑不得的场景:AI能帮你从零开始配置一台VPS&a…...
数字通信系统核心:从IQ调制到星座图,深入解析PSK/QAM的实现与优化
1. 数字通信系统的核心:IQ调制揭秘 第一次接触IQ调制这个概念时,我也被它绕晕了。什么同相分量、正交分量,听起来就像天书。直到有一天,我在调试无线电设备时突然想通:这不就是把数字信号"画"在旋转的圆盘上…...
Claude code热门快捷指令清单
文章目录1、Claude code 热门快捷指令1.1、上下文控制类1.2、回退与实验类1.3、质量审查类1.4、模型与成本控制类1.5、自动化与远程协作类1.6、官方热门指令清单1、Claude code 热门快捷指令 Claude code热门快捷指令清单。分为上下文控制、回退与实验、质量审查、模型与成本控…...
DeepSeek本地部署:从零开始,把大模型跑在自己电脑上
DeepSeek本地部署:从零开始,把大模型跑在自己电脑上我们公司因为数据安全要求,所有文档不能传到外部API。但团队又想用AI辅助写代码、做文档分析。解决方案:本地部署DeepSeek。这篇文章记录了完整的部署过程、踩过的坑、以及部署之…...
