【数据结构 04】单链表

一、链表简介

链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

链表在结构上的分类

1. 带头结点或无头结点
2. 单向或双向
3. 循环或非循环

虽然链表有多种结构类型,但是我么在实际开发中常用的只有两种结构:

  1. 无头单向非循环链表:结构简单,通常不单独使用,而是作为其他数据结构的子结构,如哈希桶、图的邻接表……
  2. 带头双向循环链表:结构最复杂,功能最全面,使用效率高

下例代码是无头单向非循环链表的实现,设计思路:

  1. 每个ListNode节点都包含一个数据和一个next指针,next指针指向下一个节点
  2. 当pList == NULL 的时候,代表这个链表为空,没有任何数据
  3. 链表最后一个节点的next指针一定是NULL
  4. 当函数涉及数据增删时,传入的参数为二级指针 ListNode** ppList

二、SingleList.h

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>typedef int DataType;typedef struct ListNode
{DataType data;struct ListNode* next;
}ListNode;bool Empty(ListNode* plist)
{return plist == NULL;
}void Print(ListNode* plist)
{ListNode* cur = plist;while (cur != NULL){printf("%2d -> ", cur->data);cur = cur->next;}printf("NULL\n");
}// 动态申请一个节点
ListNode* BuyNode(DataType x)
{ListNode* node = (ListNode*)malloc(sizeof(ListNode));node->data = x;node->next = NULL;return node;
}// 尾插
void PushBack(ListNode** pplist, DataType x)
{assert(pplist);ListNode* node = BuyNode(x);// 插入链表的第一个节点if (*pplist == NULL){*pplist = node;return;}// cur指针通过循环遍历找到链表的尾结点ListNode* cur = *pplist;while (cur->next != NULL){cur = cur->next;}cur->next = node;
}// 头插
void PushFront(ListNode** pplist, DataType x)
{assert(pplist);ListNode* node = BuyNode(x);if (*pplist == NULL){*pplist = node;return;}node->next = *pplist;*pplist = node;
}// 尾删
void PopBack(ListNode** pplist)
{if (Empty(*pplist)){printf("链表为空,尾删失败\n");return;}ListNode* cur = *pplist;ListNode* prev = cur;while (cur->next != NULL){prev = cur;cur = cur->next;}free(cur);cur = NULL;prev->next = NULL;
}// 头删
void PopFront(ListNode** pplist)
{if (Empty(*pplist)){printf("链表为空,尾删失败\n");return;}ListNode* cur = *pplist;*pplist = cur->next;free(cur);cur = NULL;
}// 查找,返回第一个元素x的节点
ListNode* Find(ListNode* plist, DataType x)
{ListNode* cur = plist;while (cur != NULL){if (cur->data == x)return cur;cur = cur->next;}return NULL;
}// 在pos后面插入新节点,pos节点由Find函数获得
void InsertAfter(ListNode* pos, DataType x)
{if (pos == NULL){printf("pos为空,数据插入失败\n");return;}ListNode* node = BuyNode(x);node->next = pos->next;pos->next = node;
}// 删除pos节点
void Delete(ListNode** pplist, ListNode* pos)
{if (pos == NULL){printf("pos为空,数据删除失败\n");return;}if (Empty(*pplist)){printf("单链表已为空,Delete失败\n");return;}ListNode* cur = *pplist;ListNode* prev = NULL;while (cur){if (cur->data == pos->data && prev == NULL){// 删除第一个节点*pplist = pos->next;free(pos);pos = NULL;return;}if (cur->data == pos->data){prev->next = pos->next;free(pos);pos = NULL;return;}prev = cur;cur = cur->next;}
}// 销毁链表
void Destroy(ListNode** pplist)
{while (*pplist){ListNode* cur = *pplist;*pplist = cur->next;free(cur);cur = NULL;}printf("链表销毁成功\n");
}

三、test.c

#define _CRT_SECURE_NO_WARNINGS 1#include "SingleList.h"int main()
{ListNode* plist = NULL;// 尾插数据PushBack(&plist, 1);PushBack(&plist, 3);PushBack(&plist, 5);PushBack(&plist, 7);Print(plist);// 头插数据PushFront(&plist, 2);PushFront(&plist, 4);PushFront(&plist, 6);PushFront(&plist, 8);Print(plist);// 尾删数据PopBack(&plist);PopBack(&plist);PopBack(&plist);Print(plist);// 头删数据PopFront(&plist);PopFront(&plist);PopFront(&plist);Print(plist);// 在查找的元素后面插入节点InsertAfter(Find(plist, 1), -1);InsertAfter(Find(plist, 2), -2);InsertAfter(Find(plist, -2), 22);Print(plist);// 删除查找到的节点Delete(&plist, Find(plist, -2));Delete(&plist, Find(plist, -1));Delete(&plist, Find(plist, 22));Delete(&plist, Find(plist, 100)); // pos为空,数据删除失败!Print(plist);// Delete删空链表Delete(&plist, Find(plist, 2));Delete(&plist, Find(plist, 1));Delete(&plist, Find(plist, 1)); // pos为空,数据删除失败!Print(plist);// 销毁链表,先插入数据测试PushBack(&plist, 1);PushBack(&plist, 2);PushBack(&plist, 3);Print(plist); // 1 -> 2 -> 3 -> NULLDestroy(&plist); // 链表销毁成功Print(plist);
}

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

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

相关文章

【RT-DETR有效改进】Bi-FPN高效的双向特征金字塔网络(附yaml文件+完整代码)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是BiFPN双向特征金字塔网络,其是一种特征融合层的结构,也就是我们本文改进RT-DETR模型中的Neck部分,它的主要思想是通过多层级的特征金字塔和双向信息传递来提高精度。本文给大家带…

甘肃推动“安全石窟”建设,新技术助力文物预防性保护

一、甘肃用“智能化”技术让文物“重获新生” 文物保护与历史遗产和文化瑰宝的安全相关。甘肃有莫高窟、麦积山、炳灵寺等石窟寺&#xff0c;背负着历史的沧桑。但是&#xff0c;岁月侵蚀使这些文物状态变得令人堪忧。环境的微妙变化和温度和湿度的波动会对其导致不可逆转的伤…

浮点数加、减运算步骤

一、浮点数介绍 1.1 浮点数格式&#xff1a; 精度位数格式单精度 float4个字节32位符号位1位&#xff0c;阶码8位&#xff0c;尾数23位双精度 double8个字节64位符号位1位&#xff0c;阶码11位&#xff0c;尾数52位 1.2 浮点的表示方法 浮点数在机器中的形式如下所示&#x…

C++数据结构与算法——链表

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

Linux初始相关配置

前言 在学完了Linux的相关基础命令后&#xff0c;在正式使用Linux系统之前&#xff0c;我觉得配置一些东西是很有意义的。 文章目录 前言1.权限配置&#xff0c;普通用户无法sudo提权2.vim配置3.vim其他操作4.动静态库5.gcc/g6.程序翻译的过程7.make/makefile8.cmake/CMakeLis…

【Unity3D小功能】Unity3D中设置Text行首不出现标点符号

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中会遇到Text的文本内容行首出现标点符号的情况&#xf…

《动手学深度学习(PyTorch版)》笔记4.8

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

实战教程:使用Spring Boot和Vue.js开发社区团购管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

使用AnimeGAN2将照片动漫化--入门

使用AnimeGAN2将照片动漫化--入门 1. 环境准备2. 使用3. 总结 1. 环境准备 首先下载AnimeGAN2:https://github.com/TachibanaYoshino/AnimeGANv2.git 然后使用conda 创建一个python3.6的环境conda create -n pyt36 python3.6&#xff1a; 创建一个requirements.txt文件&am…

生信学院|02月02日《云端设计一体化平台—3DEXPERIENCE》

课程主题&#xff1a;云端设计一体化平台—3DEXPERIENCE 课程时间&#xff1a;2024年02月02日 14:00-14:30 主讲人&#xff1a;郭俊辰 生信科技 解决方案顾问 1、云产品发展趋势 2、3DExperience产品的介绍 3、3DExperience DEMO演示 请安装腾讯会议客户端或APP&#xff…

记一次无法ping通Cisco switch处理

网络小白&#xff0c;仅仅在工作中需要telnet到switch。奈何之前不知什么原因一直无法ping通该switch&#xff0c;很久只能使用串口连接来配置了。而今遇到了使用脚本telnet switch的场景&#xff0c;不得不再次面对这个问题。 首先还是使用串口来看switch是否拿到ip&#xff…

【蓝桥杯冲冲冲】进阶搜索 Anya and Cubes

蓝桥杯备赛 | 洛谷做题打卡day22 文章目录 蓝桥杯备赛 | 洛谷做题打卡day22Anya and Cubes题面翻译输入格式输出题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示题解代码我的一些话 Anya and Cubes …

LeetCode 54 螺旋矩阵

题目描述 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#x…

线程池的知识

线程池是由服务器预先创建的一组子线程&#xff0c;线程池中的线程数量应该和 CPU 数量差不多。线程池中的所 有子线程都运行着相同的代码。当有新的任务到来时&#xff0c;主线程将通过某种方式选择线程池中的某一个子 线程来为之服务。相比与动态的创建子线程&#xff0c;选…

【昕宝爸爸小模块】深入浅出详解之常见的语法糖

深入浅出详解之常见的语法糖 一、&#x1f7e2;关于语法糖的典型解析二、&#x1f7e2;如何解语法糖&#xff1f;2.1&#x1f7e2;糖块一、switch 支持 String 与枚举2.2&#x1f4d9;糖块二、泛型2.3&#x1f4dd;糖块三、自动装箱与拆箱2.4&#x1f341;糖块四、方法变长参数…

实战Vue.js与MySQL:爱心商城项目开发指南

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【深入浅出SpringCloud原理及实战】「Netflix系列之Hystrix」针对于限流熔断组件Hystrix的回退降级实现方案和机制

针对于限流熔断组件Hystrix的回退降级实现方案和机制 依赖隔离依赖隔离之线程&线程池高延迟请求的例子 线程池的优势线程池的弊端线程池的开销线程池开销 信号量 依赖隔离 Hystrix通过使用『舱壁模式』&#xff08;注&#xff1a;将船的底部划分成一个个的舱室&#xff0c;…

SpringBoot+BCrypt算法加密

BCrypt是一种密码哈希函数,BCrypt算法使用“盐”来加密密码,这是一种随机生成的字符串,可以在密码加密过程中使用,以确保每次加密结果都不同。盐的使用增强了安全性,因为攻击者需要花费更多的时间来破解密码。 下图为使用BCrypt算法后的的密码结果值: 下面讲一下注册登陆…

[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

AIGC专题:生成式AI(GenAI)赋能供应链之路

今天分享的是AIGC系列深度研究报告&#xff1a;《AIGC专题&#xff1a;生成式AI&#xff08;GenAI&#xff09;赋能供应链之路》。 &#xff08;报告出品方&#xff1a;Gartner&#xff09; 报告共计&#xff1a;46页 什么是生成式人工智能 ChatGPT&#xff1a;一种OpenAI服…