数据结构【单链表操作大全详解】【c语言版】(只有输入输出为了方便用的c++)
单链表操作的C++/C实现详解
在数据结构中,单链表是一种非常基础且重要的数据结构。它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。今天我们就来深入探讨用C/C++实现的单链表及其各种操作。
一、单链表的定义
const int N = 1e5;
//单链表
typedef struct node {int val; //当前链表值struct node* next; //链表后面的值域(地址)
}lst;
这里定义了一个单链表节点的结构体lst
。val
用于存储节点的数据,next
是一个指针,指向链表中的下一个节点。通过这种方式,节点之间可以串联起来形成链表。const int N = 1e5;
定义了一个常量N
,虽然在当前代码中没有直接使用,但可以作为链表最大长度的一个限制,在实际应用中可能会用于内存分配或边界检查等。
二、链表初始化
//链表初始化
lst* initlst()
{lst* head;head = (lst*)malloc(sizeof (lst));//开辟空间head->next = NULL; //指向空return head;
}
initlst
函数用于初始化一个单链表。首先使用malloc
函数为头节点分配内存空间,然后将头节点的next
指针设置为NULL
,表示这是一个空链表。最后返回头节点指针,后续对链表的操作都可以通过这个头节点来进行。
三、打印链表
//打印链表
void printlst(lst*l)
{lst* p = l; //找到头指针while (p!= NULL){if (p->val!= NULL)cout << p->val << endl; //头指针不空p = p->next; //一直取出next}
}
printlst
函数用于打印链表中的所有节点值。通过一个临时指针p
从链表的头节点开始遍历,只要p
不为NULL
,就表示还没有到达链表末尾。在循环中,检查当前节点的val
值是否有效(这里if (p->val!= NULL)
判断有误,val
是int
类型,不能与NULL
比较,应直接输出p->val
),然后输出当前节点的值,并将p
移动到下一个节点。
四、尾插法相关操作
(一)单个节点尾插
void insert2(lst* l, int x) //尾插法
{lst* s, * last;last = l;while (last->next!= NULL) //找到最后的值{last = last->next;}s = (lst*)malloc(sizeof(lst));s->val = x;s->next = NULL;last->next = s;last = s;puts("完成插入");
}
insert2
函数实现了将一个新节点尾插到链表中。首先找到链表的最后一个节点(通过遍历到last->next
为NULL
),然后为新节点分配内存,设置新节点的值和next
指针(next
为NULL
表示这是链表的最后一个节点),最后将新节点连接到链表的末尾,并更新last
指针。
(二)多个节点尾插初始化
void initinsert2(lst *l, int n) {//尾插法の初始化lst* s, * last;last = l;puts("请输入");for (int i = 1; i <= n; i++) {int x;cin >> x;s = (lst*)malloc(sizeof(lst));s->val = x;s->next = NULL;last->next = s;last = s;}puts("完成插入");
}
initinsert2
函数用于通过尾插法初始化链表,一次性插入n
个节点。它与insert2
函数的原理类似,通过循环多次执行尾插操作,每次从用户输入中获取一个值,创建新节点并插入到链表末尾。
五、头插法相关操作
(一)单个节点头插
void insert1(lst* &l, int x) //头插法[记得要取地址]
{//1.c++:lst *&l//2.c:lst** llst* s;s = (lst*)malloc(sizeof(lst));s->val = x;s->next = l;l = s;
}
insert1
函数实现了头插法,将一个新节点插入到链表的头部。这里lst* &l
表示传递的是头指针的引用,这样在函数内部对l
的修改会直接影响到函数外部的头指针。首先为新节点分配内存,设置新节点的值,然后将新节点的next
指针指向原来的头节点,最后更新头指针l
,使其指向新插入的节点。需要注意的是这里要用地址,方便更新头结点
(二)多个节点头插初始化
void initinsert1(lst* l, int n) {//头插法の初始化lst* s;puts("请输入");for (int i = 1; i <= n; i++) {int x;cin >> x;s = (lst*)malloc(sizeof(lst));s->val = x;s->next = l->next;l->next = s;//l = s;}puts("完成插入");
}
六、求链表长度
//求长度
int get_len(lst* l)
{lst* p = l->next;int len = 0;while (p!= NULL){p = p->next;len++;}return len;
}
get_len
函数用于计算链表的长度(不包括头节点)。通过一个临时指针p
从链表头节点的下一个节点开始遍历,每遍历一个节点,长度计数器len
就加1,直到遍历完整个链表(p
为NULL
),最后返回链表的长度。
七、查找操作
(一)按值查找位置
//查找
void find_idex(lst* l, int x) //找x的位置
{lst* p = l->next;int id = 1;while (p!= NULL && p->val!= x){p = p->next;id++;}if (p!= NULL) cout << "位置=" << id << endl;
}
find_idex
函数用于查找值为x
的节点在链表中的位置(从1开始计数)。从链表的第一个数据节点开始遍历,同时记录当前节点的位置id
,如果找到值为x
的节点,就输出其位置;如果遍历完链表都没有找到,则不输出任何信息。
(二)按位置查找值
void find_val(lst* l, int x) //找x的位置上的值
{lst* p = l->next;int j = 1;while (p!= NULL && j < x){p = p->next;j++;}if (x == j) cout << "值=" << p->val << endl;
}
find_val
函数用于查找链表中第x
个位置的节点的值。同样从链表的第一个数据节点开始遍历,用j
记录当前遍历到的节点位置,当遍历到第x
个节点时,输出该节点的值。
八、插入操作
//插入
void insert(lst* l, int i, int x) //找i插入x
{lst* p, * s;int j = 0;while (p->next!= NULL && j < i - 1){p = p->next;j++;}if (p!= NULL){s = (lst*)malloc(sizeof(lst));s->val = x;s->next = p->next;p->next = s;}
}
insert
函数用于在链表的第i
个位置插入值为x
的节点。首先找到第i - 1
个节点(通过遍历并计数j
),然后为新节点分配内存,设置新节点的值和next
指针,使其插入到第i - 1
个节点和第i
个节点之间。需要注意的是,这里代码存在问题,while (p->next!= NULL && j < i - 1)
中p
未初始化,应在循环前将p
初始化为l
。
九、删除操作
//删除
void insert(lst* l, int i)
{lst* p, * s;int j = 0;while (p->next!= NULL && j < i - 1){p = p->next;j++;}if (p!= NULL&&j == i - 1) //删除的位置要在i之前{s = p->next; //这个是要删的地址p->next = s->next;free(s); //释放空间}
}
这里insert
函数名错误,应该改为deleteNode
之类的名字。此函数用于删除链表中第i
个节点。先找到第i - 1
个节点,然后将第i
个节点从链表中移除(通过修改指针),并释放第i
个节点的内存空间。同样,这里也存在p
未初始化的问题,应在循环前将p
初始化为l
。
十、总结
通过以上对单链表各种操作的实现,我们可以看到单链表在数据存储和操作上的灵活性。虽然代码中存在一些小问题,如类型判断错误、指针未初始化等,但通过理解这些操作的原理和逻辑,我们可以更好地掌握单链表这一数据结构,并且能够根据实际需求进行优化和改进。在实际应用中,单链表常用于实现栈、队列等数据结构,以及在需要动态分配内存和频繁插入删除操作的场景中发挥重要作用。
相关文章:

数据结构【单链表操作大全详解】【c语言版】(只有输入输出为了方便用的c++)
单链表操作的C/C实现详解 在数据结构中,单链表是一种非常基础且重要的数据结构。它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。今天我们就来深入探讨用C/C实现的单链表及其各种操作。 一、单链表的定义 const int N 1e5; //单链表 t…...

leetcode27.删除有序数组中的重复项
目录 问题描述判题标准示例提示 具体思路思路一思路二 代码实现 问题描述 给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致 。然后返回nums中唯一元…...

[c语言日寄]越界访问:意外的死循环
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...

【c++11】包装器
🔥个人主页:Quitecoder 🔥专栏:c笔记仓 包装器(Wrapper) 是一个常见的编程设计模式,通常用于封装或“包装”某个现有的对象、函数、数据结构或者操作,以提供额外的功能或简化接口。…...

信息学奥赛一本通 1422:【例题1】活动安排
【题目链接】 ybt 1422:【例题1】活动安排 【题目考点】 1. 贪心 【解题思路】 该题属于区间选点问题,ybt 1324:【例6.6】整数区间 是给定一些区间,选择一些点使得每个区间范围内至少有1个点。 本题为:给定一些区…...

数据库、数据仓库、数据湖有什么不同
数据库、数据仓库和数据湖是三种不同的数据存储和管理技术,它们在用途、设计目标、数据处理方式以及适用场景上存在显著差异。以下将从多个角度详细说明它们之间的区别: 1. 数据结构与存储方式 数据库: 数据库主要用于存储结构化的数据&…...

llama.cpp LLM_CHAT_TEMPLATE_DEEPSEEK_3
llama.cpp LLM_CHAT_TEMPLATE_DEEPSEEK_3 1. LLAMA_VOCAB_PRE_TYPE_DEEPSEEK3_LLM2. static const std::map<std::string, llm_chat_template> LLM_CHAT_TEMPLATES3. LLM_CHAT_TEMPLATE_DEEPSEEK_3References 不宜吹捧中国大语言模型的同时,又去贬低美国大语言…...

深度学习的应用场景及常用技术
深度学习作为机器学习的一个重要分支,在众多领域都有广泛的应用,以下是一些主要的应用场景及常用技术。 1.应用场景 1. 计算机视觉 图像分类 描述:对图像中的内容进行分类,识别出图像中物体所属的类别。例如,在安防领…...

小程序项目-购物-首页与准备
前言 这一节讲一个购物项目 1. 项目介绍与项目文档 我们这里可以打开一个网址 https://applet-base-api-t.itheima.net/docs-uni-shop/index.htm 就可以查看对应的文档 2. 配置uni-app的开发环境 可以先打开这个的官网 https://uniapp.dcloud.net.cn/ 使用这个就可以发布到…...

网件r7000刷回原厂固件合集测评
《网件R7000路由器刷回原厂固件详解》 网件R7000是一款备受赞誉的高性能无线路由器,其强大的性能和可定制性吸引了许多高级用户。然而,有时候用户可能会尝试第三方固件以提升功能或优化网络性能,但这也可能导致一些问题,如系统不…...

微信登录模块封装
文章目录 1.资质申请2.combinations-wx-login-starter1.目录结构2.pom.xml 引入okhttp依赖3.WxLoginProperties.java 属性配置4.WxLoginUtil.java 后端通过 code 获取 access_token的工具类5.WxLoginAutoConfiguration.java 自动配置类6.spring.factories 激活自动配置类 3.com…...

[STM32 - 野火] - - - 固件库学习笔记 - - -十三.高级定时器
一、高级定时器简介 高级定时器的简介在前面一章已经介绍过,可以点击下面链接了解,在这里进行一些补充。 [STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器 1.1 功能简介 1、高级定时器可以向上/向下/两边计数,还独有一个重复计…...

后台管理系统通用页面抽离=>高阶组件+配置文件+hooks
目录结构 配置文件和通用页面组件 content.config.ts const contentConfig {pageName: "role",header: {title: "角色列表",btnText: "新建角色"},propsList: [{ type: "selection", label: "选择", width: "80px&q…...

8.原型模式(Prototype)
动机 在软件系统中,经常面临着某些结构复杂的对象的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。 之前的工厂方法和抽象工厂将抽象基类和具体的实现分开。原型模式也差不多&#…...

Python-基于PyQt5,pdf2docx,pathlib的PDF转Word工具(专业版)
前言:日常生活中,我们常常会跟WPS Office打交道。作表格,写报告,写PPT......可以说,我们的生活已经离不开WPS Office了。与此同时,我们在这个过程中也会遇到各种各样的技术阻碍,例如部分软件的PDF转Word需要收取额外费用等。那么,可不可以自己开发一个小工具来实现PDF转…...

13 尺寸结构模块(size.rs)
一、size.rs源码 // Copyright 2013 The Servo Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE…...

STM32单片机学习记录(2.2)
一、STM32 13.1 - PWR简介 1. PWR(Power Control)电源控制 (1)PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能; (2)可编程电压监测器(…...

CSS 样式化表格:从基础到高级技巧
CSS 样式化表格:从基础到高级技巧 1. 典型的 HTML 表格结构2. 为表格添加样式2.1 间距和布局2.2 简单的排版2.3 图形和颜色2.4 斑马条纹2.5 样式化标题 3. 完整的示例代码4. 总结 在网页设计中,表格是展示数据的常见方式。然而,默认的表格样式…...

【python】tkinter实现音乐播放器(源码+音频文件)【独一无二】
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 【python】tkinter实现音乐播放器(源码…...

javascript常用函数大全
javascript函数一共可分为五类: •常规函数 •数组函数 •日期函数 •数学函数 •字符串函数 1.常规函数 javascript常规函数包括以下9个函数: (1)alert函数:显示一个警告对话框,包括一个OK按钮。 (2)confirm函数:显…...

C#属性和字段(访问修饰符)
不同点逻辑性/灵活性存储性访问性使用范围安全性属性(Property)源于字段,对字段的扩展,逻辑字段并不占用实际的内存可以被其他类访问对接收的数据范围做限定,外部使用增加了数据的安全性字段(Field)不经过逻辑处理占用内存的空间及位置大部分字段不能直接被访问内存使用不安全 …...

DeepSeek为什么超越了OpenAI?从“存在主义之问”看AI的觉醒
悉尼大学学者Teodor Mitew向DeepSeek提出的问题,在推特上掀起了一场关于AI与人类意识的大讨论。当被问及"你最想问人类什么问题"时,DeepSeek的回答直指人类存在的本质:"如果意识是进化的偶然,宇宙没有内在的意义&a…...

langchain基础(二)
一、输出解析器(Output Parser) 作用:(1)让模型按照指定的格式输出; (2)解析模型输出,提取所需的信息 1、逗号分隔列表 CommaSeparatedListOutputParser:…...

数据库安全管理中的权限控制:保护数据资产的关键措施
title: 数据库安全管理中的权限控制:保护数据资产的关键措施 date: 2025/2/2 updated: 2025/2/2 author: cmdragon excerpt: 在信息化迅速发展的今天,数据库作为关键的数据存储和管理中心,已经成为了企业营运和决策的核心所在。然而,伴随着数据规模的不断扩大和数据价值…...

Leetcode598:区间加法 II
题目描述: 给你一个 m x n 的矩阵 M 和一个操作数组 op 。矩阵初始化时所有的单元格都为 0 。ops[i] [ai, bi] 意味着当所有的 0 < x < ai 和 0 < y < bi 时, M[x][y] 应该加 1。 在 执行完所有操作后 ,计算并返回 矩阵中最大…...

【Proteus】NE555纯硬件实现LED呼吸灯效果,附源文件,效果展示
本文通过NE555定时器芯片和简单的电容充放电电路,设计了一种纯硬件实现的呼吸灯方案,并借助Proteus仿真软件验证其功能。方案无需编程,成本低且易于实现,适合电子爱好者学习PWM(脉宽调制)和定时器电路原理。 一、呼吸灯原理与NE555功能分析 1. 呼吸灯核心原理 呼吸灯的…...

SAP HCM insufficient authorization, no.skipped personnel 总结归纳
导读 权限:HCM模块中有普通权限和结构化权限。普通权限就是PFCG的权限,结构化权限就是按照部门ID授权,颗粒度更细,对分工明细化的单位尤其重要,今天遇到的问题就是结构化权限的问题。 作者:vivi,来源&…...

五. Redis 配置内容(详细配置说明)
五. Redis 配置内容(详细配置说明) 文章目录 五. Redis 配置内容(详细配置说明)1. Units 单位配置2. INCLUDES (包含)配置3. NETWORK (网络)配置3.1 bind(配置访问内容)3.2 protected-mode (保护模式)3.3 port(端口)配置3.4 timeout(客户端超时时间)配置3.5 tcp-keepalive()配置…...

4 [危机13小时追踪一场GitHub投毒事件]
事件概要 自北京时间 2024.12.4 晚间6点起, GitHub 上不断出现“幽灵仓库”,仓库中没有任何代码,只有诱导性的病毒文件。当天,他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒,等待不…...

Shadow DOM举例
这东西具有隔离效果,对于一些插件需要append一些div倒是不错的选择 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"utf-8"> <title>演示例子</title> </head> <body> <style&g…...