单链表设计与实现

news2025/5/12 12:39:27

01. 单链表简介

在数据结构中,单链表的实现可以分为 带头结点不带头结点 两种方式,这里我们讨论第二种方式。

  • 头结点:链表第一个节点不存实际数据,仅作为辅助节点指向首元节点(第一个数据节点)。
  • 头指针:永远指向头结点(非空链表头结点始终存在)。

在这里插入图片描述

单链表核心数据结构及操作声明:

typedef struct Node {
    int data;         // 节点数据域
    struct Node* next;// 节点指针域
} Node;
// 初始化带头结点的空链表
Node* InitList();
// 头插法建立链表
void HeadInsert(Node* list, int data);
// 尾插法建立链表
void TailInsert(Node* list, int data);
// 删除指定数据节点
void Delete(Node* list, int data);
// 遍历打印链表
void PrintList(Node* list);
//创建单链表
Node* list = InitList();
HeadInsert(list,1);//如头插
TailInsert(list,2);//如尾插

02.链表初始化

创建一个头结点,内部的data标明有多少个节点的计数,头结点的指针域置为空。

Node* InitList() {
       Node* list = (Node*)malloc(sizeof(Node));
       list->data = 0;
       list->next = NULL;
       return list;
}

03.头插法与尾插法

头插法简单,只需要在头结点后面插入即可,尾插法较为复杂,需要保存头结点指针,当list->next的节点不为空的时候,会继续往下面执行while循环,跳出循环的时候标明已经指向最后一个结点,随后即可插入。

void headInsert(Node* list, int data) {
       Node* node = (Node*)malloc(sizeof(Node));
       node->data = data;
       node->next = list->next;
       list->next = node;
       list->data++;
}
void tailInsert(Node* list, int data) {
       Node* head = list;//此处会改变头结点,所以临时保存一下
       Node* node = (Node*)malloc(sizeof(Node));
       node->data = data;
       node -> next = NULL;
       list = list->next;//将指针移动到头结点,头结点也移动了!!!
       while (list->next) {//当list的下一个节点不为空的时候,会继续往下面执行
               list = list->next;//list继续往下面执行
       }
       list->next = node;
       head->data++;
}

04.链表的删除

链表的删除需要precurrent两个指针配合,通过比对其中的data里面的数据进行判断,不符合时,两个指针都向后移,知道匹配到对应数据时停下删除该结点。

void Delete(Node* list, int data) {
       Node* pre = list;
       Node* current = list->next;
       while (current){
               if (current->data = data) {
                      pre->next = current->next;
                      free(current);
                      break;/无重复退出
       }
               pre = current;
               current = current->next;
       }
       list->data--;
}

05.链表的输出

依次循环输出即可。

void printlist(Node* list) {
       list = list->next;//指向头结点
       while (list){//list不为空就继续执行
               printf("%d ", list->data);
               list = list->next;//list往下走
       }
       printf("\n");
}

图片后续有时间会补上!!

;
list = list->next;//list往下走
}
printf(“\n”);
}


---

### 图片后续有时间会补上!!

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

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

相关文章

springboot生成二维码到海报模板上

springboot生成二维码到海报模板上 QRCodeController package com.ruoyi.web.controller.app;import com.google.zxing.WriterException; import com.ruoyi.app.domain.Opportunity; import com.ruoyi.app.tool.QRCodeGenerator; import com.ruoyi.common.core.page.TableDat…

SEO长尾关键词布局优化法则

内容概要 在SEO优化体系中,长尾关键词的精准布局是突破流量瓶颈的关键路径。相较于竞争激烈的核心词,长尾词凭借其高转化率和低竞争特性,成为内容矩阵流量裂变的核心驱动力。本节将系统梳理长尾关键词布局的核心逻辑框架,涵盖从需…

python:trimesh 用于 STL 文件解析和 3D 操作

python:trimesh 是一个用于处理三维模型的库,支持多种格式的导入导出,比如STL、OBJ等,还包含网格操作、几何计算等功能。 Python Trimesh 库使用指南 安装依赖库 pip install trimesh Downloading trimesh-4.6.8-py3-none-any.w…

应急响应基础模拟靶机-security2

PS:杰克创建的流量包(result.pcap)在root目录下,请根据已有信息进行分析 1、首个攻击者扫描端口使用的工具是? 2、后个攻击者使用的漏洞扫描工具是? 3、攻击者上传webshell的绝对路径及User-agent是什么? 4、攻击者反弹shell的…

OpenCV定位地板上的书

任务目标是将下面的图片中的书本找出来: 使用到的技术包括:转灰度图、提取颜色分量、二值化、形态学、轮廓提取等。 我们尝试先把图片转为灰度图,然后二值化,看看效果: 可以看到,二值化后,书的…

NHANES稀有指标推荐:MedHi

文章题目:Association of dietary live microbe intake with frailty in US adults: evidence from NHANES DOI:10.1016/j.jnha.2024.100171 中文标题:美国成人膳食活微生物摄入量与虚弱的相关性:来自 NHANES 的证据 发表杂志&…

关于我在实现用户头像更换时遇到的图片上传和保存的问题

目录 前言 前端更换头像 后端处理 文件系统存储图片 数据库存储图片 处理图片文件 生成图片名 保存图片 将图片路径存储到数据库 完整代码 总结 前言 最近在实现一个用户头像更换的功能,但是因为之前并没有处理过图片的上传和保存,所以就开始…

10.二叉搜索树中第k小的元素(medium)

1.题目链接: 230. 二叉搜索树中第 K 小的元素 - 力扣(LeetCode)230. 二叉搜索树中第 K 小的元素 - 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数…

AlimaLinux设置静态IP

通过nmcli命令来操作 步骤 1:确认当前活动的网络接口名称 首先,需要确认当前系统中可用的网络接口名称。可以使用以下命令查看: nmcli device步骤 2:修改配置以匹配正确的接口名称 sudo nmcli connection modify ens160 ipv4.…

滑动窗口——将x减到0的最小操作数

题目: 这个题如果我们直接去思考方法是很困难的,因为我们不知道下一步是在数组的左还是右操作才能使其最小。正难则反,思考一下,无论是怎么样的,最终这个数组都会分成三个部分左中右,而左右的组合就是我们…

基于SpringBoot的抽奖系统测试报告

一、编写目的 本报告为抽奖系统测试报告,本项目可用于团体抽奖活动,包括了用户注册,用户登录,修改奖项以及抽奖等功能。 二、项目背景 抽奖系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据&…

服务器mysql连接我碰到的错误

搞了2个下午,总算成功了 我在服务器上使用docker部署了java项目与mysql,但mysql连接一直出现问题 1.首先,我使用的是localhost连接,心想反正都在服务器上吧。 jdbc:mysql://localhost:3306/fly-bird?useSSLfalse&serverTime…

【Part 2安卓原生360°VR播放器开发实战】第四节|安卓VR播放器性能优化与设备适配

《VR 360全景视频开发》专栏 将带你深入探索从全景视频制作到Unity眼镜端应用开发的全流程技术。专栏内容涵盖安卓原生VR播放器开发、Unity VR视频渲染与手势交互、360全景视频制作与优化,以及高分辨率视频性能优化等实战技巧。 📝 希望通过这个专栏&am…

从知识图谱到精准决策:基于MCP的招投标货物比对溯源系统实践

前言 从最初对人工智能的懵懂认知,到逐渐踏入Prompt工程的世界,我们一路探索,从私有化部署的实际场景,到对DeepSeek技术的全面解读,再逐步深入到NL2SQL、知识图谱构建、RAG知识库设计,以及ChatBI这些高阶应…

图形化编程革命:iVX携手AI 原生开发范式

一、技术核心:图形化编程的底层架构解析 1. 图形化开发的效率优势:代码量减少 72% 的秘密 传统文本编程存在显著的信息密度瓶颈。以 "按钮点击→条件判断→调用接口→弹窗反馈" 流程为例,Python 实现需定义函数、处理缩进并编写 …

JAVA EE_网络原理_网络层

晨雾散尽,花影清晰。 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ----------陳長生. ❀主页:陳長生.-CSDN博客❀ 📕上一篇:数据库Mysql_联…

森林生态学研究深度解析:R语言入门、生物多样性分析、机器学习建模与群落稳定性评估

在生态学研究中,森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性,还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…

AI大模型学习十八、利用Dify+deepseekR1 +本地部署Stable Diffusion搭建 AI 图片生成应用

一、说明 最近在学习Dify工作流的一些玩法,下面将介绍一下Dify Stable Diffusion实现文生图工作流的应用方法 Dify与Stable Diffusion的协同价值 Dify作为低代码AI开发平台的优势:可视化编排、API快速集成 Stable Diffusion的核心能力:高效…

关于chatshare.xyz激活码使用说明和渠道指南!

chatshare.xyz和chatshare.biz是两个被比较的平台,分别在其功能特性和获取渠道有所不同。 本文旨在探讨它们的差异,以及提供如何获取并使用的平台信息。此外,还提及其他一些相关资源和模板推荐以满足用户需求。 主要区分关键点 1、chatshar…

Qt开发经验 --- 避坑指南(14)

文章目录 [toc]1 linux下使用linuxdeploy打包2 Qt源码下载3 QtCreator配置github copilot实现AI编程4 使用其它编程AI辅助开发Qt5 Qt开源UI库6 QT6.8以后版本安装QtWebEngine7 清除QtCreator配置 更多精彩内容👉内容导航 👈👉Qt开发经验 &…