数据结构【单链表操作大全详解】【c语言版】(只有输入输出为了方便用的c++)

单链表操作的C++/C实现详解

在数据结构中,单链表是一种非常基础且重要的数据结构。它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。今天我们就来深入探讨用C/C++实现的单链表及其各种操作。

一、单链表的定义

const int N = 1e5;
//单链表
typedef struct node {int val;  //当前链表值struct node* next;  //链表后面的值域(地址)
}lst;

这里定义了一个单链表节点的结构体lstval用于存储节点的数据,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)判断有误,valint类型,不能与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->nextNULL),然后为新节点分配内存,设置新节点的值和next指针(nextNULL表示这是链表的最后一个节点),最后将新节点连接到链表的末尾,并更新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,直到遍历完整个链表(pNULL),最后返回链表的长度。

七、查找操作

(一)按值查找位置

//查找
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

十、总结

通过以上对单链表各种操作的实现,我们可以看到单链表在数据存储和操作上的灵活性。虽然代码中存在一些小问题,如类型判断错误、指针未初始化等,但通过理解这些操作的原理和逻辑,我们可以更好地掌握单链表这一数据结构,并且能够根据实际需求进行优化和改进。在实际应用中,单链表常用于实现栈、队列等数据结构,以及在需要动态分配内存和频繁插入删除操作的场景中发挥重要作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/894216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI软件外包需要注意什么 外包开发AI软件的关键因素是什么 如何选择AI外包开发语言

1. 定义目标与需求 首先&#xff0c;要明确你希望AI智能体做什么。是自动化任务、数据分析、自然语言处理&#xff0c;还是其他功能&#xff1f;明确目标可以帮助你选择合适的技术和方法。 2. 选择开发平台与工具 开发AI智能体的软件时&#xff0c;你需要选择适合的编程语言、…

学习数据结构(5)单向链表的实现

&#xff08;1&#xff09;头部插入 &#xff08;2&#xff09;尾部删除 &#xff08;3&#xff09;头部删除 &#xff08;4&#xff09;查找 &#xff08;5&#xff09;在指定位置之前插入节点 &#xff08;6&#xff09;在指定位置之后插入节点 &#xff08;7&#xff09;删除…

深入理解MySQL 的 索引

索引是一种用来快速检索数据的一种结构, 索引使用的好不好关系到对应的数据库性能方面, 这篇文章我们就来详细的介绍一下数据库的索引。 1. 页面的大小: B 树索引是一种 Key-Value 结构&#xff0c;通过 Key 可以快速查找到对应的 Value。B 树索引由根页面&#xff08;Root&am…

Vue-cli 脚手架搭建

安装node.js 官网下载node.js安装包&#xff0c;地址&#xff1a;Node.js — Download Node.js 先在node.js即将要安装的路径下创建两个文件夹&#xff1a;node_cache&#xff08;缓存&#xff09;、node_global&#xff08;全局&#xff09; 点击安装包&#xf…

深度解析 DeepSeek R1:强化学习与知识蒸馏的协同力量

DeepSeek-R1 的问世&#xff0c;无疑在 AI 领域激起了千层浪。自发布仅一周&#xff0c;它便凭借卓越的性能和创新的技术&#xff0c;成为 AI 社区热议的焦点&#xff0c;代表着人工智能在推理和理解能力上的重大飞跃。今天我们一起深度解析一下DeepSeek-R1 一、强大基石&…

openssl 生成证书 windows导入证书

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

笔记本搭配显示器

笔记本&#xff1a;2022款拯救者Y9000P&#xff0c;显卡RTX3060&#xff0c;分辨率2560*1600&#xff0c;刷新率&#xff1a;165Hz&#xff0c;无DP1.4口 显示器&#xff1a;2024款R27Q&#xff0c;27存&#xff0c;分辨率2560*1600&#xff0c;刷新率&#xff1a;165Hz &…

在php中怎么打开OpenSSL

&#xff08;点击即可进入聊天助手&#xff09; 背景 在使用php做一些项目时,有用到用户邮箱注册等,需要开启openssl的能力 在php系统中openssl默认是关闭状态的,在一些低版本php系统中,有的甚至需要在服务器终端后台,手动安装 要打开OpenSSL扩展&#xff0c;需要进行以下步骤 …

【单细胞第二节:单细胞示例数据分析-GSE218208】

GSE218208 1.创建Seurat对象 #untar(“GSE218208_RAW.tar”) rm(list ls()) a data.table::fread("GSM6736629_10x-PBMC-1_ds0.1974_CountMatrix.tsv.gz",data.table F) a[1:4,1:4] library(tidyverse) a$alias:gene str_split(a$alias:gene,":",si…

K8S 快速实战

K8S 核心架构原理: 我们已经知道了 K8S 的核心功能:自动化运维管理多个容器化程序。那么 K8S 怎么做到的呢?这里,我们从宏观架构上来学习 K8S 的设计思想。首先看下图: K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责核心的调度、管理和运维,Slave…

134.力扣刷题--加油站--滑动窗口

你知道的&#xff0c;失败总是贯穿人生的始终。 加油站 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#x…

爬虫基础(二)Web网页的基本原理

一、网页的组成 网页由三部分构成&#xff1a;HTML、JavaScript、CSS。 &#xff08;1&#xff09;HTML HTML 相当于网页的骨架&#xff0c;它通过使用标签来定义网页内容的结构。 举个例子&#xff1a; 它把图片标签为img、把视频标签为video&#xff0c;然后组合到一个界面…

Three.js实现3D动态心形与粒子背景的数学与代码映射解析

一、效果概述 本文通过Three.js构建了一个具有科技感的3D场景&#xff0c;主要包含两大视觉元素&#xff1a; 动态心形模型&#xff1a;采用数学函数生成基础形状&#xff0c;通过顶点操作实现表面弧度。星空粒子背景&#xff1a;随机分布的粒子群组形成空间层次感。复合动画…

Java线程认识和Object的一些方法

专栏系列文章地址&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标&#xff1a; 要对Java线程有整体了解&#xff0c;深入认识到里面的一些方法和Object对象方法的区别。认识到Java对象的ObjectMonitor&#xff0c;这有助于后面的Synchron…

【蓝桥杯省赛真题02】C++猫吃鱼 第十届蓝桥杯青少年创意编程大赛 算法思维 C++编程省赛真题解

目录 C猫吃鱼 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 七、推荐资料 C猫吃鱼 第十届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 明明家从1号站点出发&#xff0c;开车去旅游&#xff0c;一共要经过n个…

无公网IP 外网访问 本地部署夫人 hello-algo

hello-algo 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式&#xff0c;为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo&#xff0c;并结合路由侠内网穿透实现外网访问本地部署…

基础项目实战——学生管理系统(c++)

目录 前言一、功能菜单界面二、类与结构体的实现三、录入学生信息四、删除学生信息五、更改学生信息六、查找学生信息七、统计学生人数八、保存学生信息九、读取学生信息十、打印所有学生信息十一、退出系统十二、文件拆分结语 前言 这一期我们来一起学习我们在大学做过的课程…

实现基础的shell程序

1. 实现一个基础的 shell 程序&#xff0c;主要完成两个命令的功能 cp 和 ls 1.1.1. cp 命令主要实现&#xff1a; ⽂件复制⽬录复制 1.1.2. ls 命令主要实现&#xff1a; ls -l 命令的功能 1.1. 在框架设计上&#xff0c;采⽤模块化设计思想&#xff0c;并具备⼀定的可扩…

ADC 精度 第二部分:总的未调整误差解析

在关于ADC精度的第一篇文章中&#xff0c;我们阐述了模拟-数字转换器&#xff08;ADC&#xff09;的分辨率和精度之间的区别。现在&#xff0c;我们可以深入探讨影响ADC总精度的因素&#xff0c;这通常被称为总未调整误差&#xff08;TUE&#xff09;。 你是否曾好奇ADC数据表…

渲染流程概述

渲染流程包括 CPU应用程序端渲染逻辑 和 GPU渲染管线 一、CPU应用程序端渲染逻辑 剔除操作对物体进行渲染排序打包数据调用Shader SetPassCall 和 Drawcall 1.剔除操作 视椎体剔除 &#xff08;给物体一个包围盒&#xff0c;利用包围盒和摄像机的视椎体进行碰撞检测&#xf…