C理解(四):链表
本文主要探讨单链表与双链表相关知识。
linux内核链表(include/linux/list.h)
内核链表中纯链表封装,纯链表的各种操作函数(节点创建、插入、删除、遍历······),纯链表内嵌在驱动结构体中,实现驱动的创建、插入、删除、遍历等
单链表
单链表链表头插入节点,尾插入节点,删除节点,逆序
代码示例:
#include <stdio.h>
#include <stdlib.h>struct node
{int data;struct node *next;
};//创建节点
struct node * create_node(int data)
{struct node *p = (struct node *)malloc(sizeof(struct node));if(p == NULL){printf("malloc error\n");return NULL;}p->data = data;p->next = NULL;return p;
}//头部插入节点
void insert_head(struct node *phead,struct node *new)
{struct node *p = phead;if(p == NULL)exit(0);new->next = p->next;p->next = new;(phead->data)++; //头节点存储节点数量
}//尾部插入
void insert_tail(struct node *phead,struct node *new)
{struct node *p = phead;if(p == NULL)exit(0);while(p->next != NULL){p = p->next;}p->next = new;(phead->data)++; //头节点存储节点数量
}//遍历链表
void printf_link(struct node *phead)
{if(phead == NULL)exit(0);struct node *p = phead;printf("num of struct : %d \n",p->data);while(p->next != NULL){p = p->next;printf("struct data : %d\n",p->data);}
}//删除节点
int delete_node(struct node *phead,int data)
{if(phead == NULL)exit(-1);struct node *p = phead;struct node *prev = NULL;while(p->next != NULL){prev = p;p = p->next;if(p->data == data){if(p->next != NULL){prev->next = p->next; //其他节点free(p);}else{prev->next = NULL; //尾节点free(p);}(phead->data)--;return 0;}}printf("have no data\n");return -1;
}//链表逆序
void reserve_link(struct node *phead)
{if(phead == NULL)exit(-1);struct node *p = phead->next;struct node *back = NULL;struct node *prev = NULL;if(p->next == NULL || p == NULL) //只有一个节点,不逆序return ;while(p->next != NULL) //两个及两个以上节点{back = p->next; //保存链表的下一个节点,由于头插逆序法插入节点与后面节点断开if(p == phead->next) //第一个节点指向NULL作为逆序首节点{p->next = NULL;}else{p->next = phead->next;}phead->next = p;p = back;}insert_head(phead,p); //最后一个节点插入到链表,由于最后一个节点指向NULL,while判断失效(phead->data)--; //头插最后一个节点时,默认新增一个节点
}int main()
{//创建头节点struct node *head = create_node(0);//头部插入节点insert_head(head,create_node(1));insert_head(head,create_node(2));insert_head(head,create_node(3));insert_head(head,create_node(4));insert_head(head,create_node(5));//尾部插入节点insert_tail(head,create_node(1));insert_tail(head,create_node(2));insert_tail(head,create_node(3));insert_tail(head,create_node(4));insert_tail(head,create_node(5));//遍历节点printf_link(head);//删除节点delete_node(head,5);delete_node(head,5);delete_node(head,4);//遍历节点printf_link(head);//链表逆序reserve_link(head);//遍历节点printf_link(head);return 0;
}
结果示例:

双链表
双链表尾插入,头插入,删除节点,前向遍历,后向遍历
代码示例:
#include <stdio.h>
#include <stdlib.h>struct node
{int data;struct node *next;struct node *prev;
};//创建节点
struct node * create_node(int data)
{struct node *p = (struct node *)malloc(sizeof(struct node));if(p == NULL){printf("malloc error\n");return NULL;}p->data = data;p->next = NULL;p->prev = NULL;return p;
}//头部插入节点
void insert_head(struct node *phead,struct node *new)
{struct node *p = phead;if(p == NULL)exit(0);new->next = p->next;if(p->next != NULL)p->next->prev = new;p->next = new;new->prev = p;(phead->data)++; //头节点存储节点数量
}//尾部插入
void insert_tail(struct node *phead,struct node *new)
{struct node *p = phead;if(p == NULL)exit(0);while(p->next != NULL){p = p->next;}p->next = new;new->prev = p;new->next = NULL;(phead->data)++; //头节点存储节点数量
}//后项遍历链表
void next_printf_link(struct node *phead)
{if(phead == NULL)exit(0);struct node *p = phead;printf("num of struct : %d \n",p->data);while(p->next != NULL){p = p->next;printf("struct data : %d\n",p->data);}
}//前项遍历链表
void prev_printf_link(struct node *phead)
{if(phead == NULL)exit(0);struct node *p = phead;printf("num of struct : %d \n",p->data);while(p->next != NULL){p = p->next;}while(p->prev != NULL){printf("struct data : %d\n",p->data);p = p->prev;}
}//删除节点
int delete_node(struct node *phead,int data)
{if(phead == NULL)exit(-1);struct node *p = phead;struct node *test = NULL;while(p->next != NULL){p = p->next;if(p->data == data){if(p->next == NULL){p->prev->next = NULL; //尾节点}else{//其他节点p->prev->next = p->next;p->next->prev = p->prev;}free(p);(phead->data)--;return 0;}}printf("have no data\n");return -1;
}int main()
{//创建头节点struct node *head = create_node(0);//头部插入节点insert_head(head,create_node(1));insert_head(head,create_node(2));insert_head(head,create_node(3));insert_head(head,create_node(4));insert_head(head,create_node(5));//尾部插入节点insert_tail(head,create_node(1));insert_tail(head,create_node(2));insert_tail(head,create_node(3));insert_tail(head,create_node(4));insert_tail(head,create_node(5));//遍历节点next_printf_link(head);//删除节点delete_node(head,2);delete_node(head,5);delete_node(head,4);//next遍历节点next_printf_link(head);//prev遍历节点prev_printf_link(head);return 0;
}
结果示例:

相关文章:
C理解(四):链表
本文主要探讨单链表与双链表相关知识。 linux内核链表(include/linux/list.h) 内核链表中纯链表封装,纯链表的各种操作函数(节点创建、插入、删除、遍历),纯链表内嵌在驱动结构体中,实现驱动的创建、插入、删除、遍历等 单链表 单链表链表头插…...
新手教程,蛋糕小程序的搭建流程一网打尽
作为一名新手,想要搭建一个蛋糕小程序可能会觉得有些困惑。但是,不用担心!今天我将为大家详细介绍蛋糕小程序的搭建流程,并带大家一步步完成。 首先,我们需要登录乔拓云网的后台。在登录成功后,点击进入商城…...
springcloud之自我介绍
写在前面 在这篇文章 中我们分析了单体应用的问题,以及用来解决这些问题的解决的方案微服务,并接着看了微服务需要考虑的各种,如服务调用,负载均衡,服务治理,链路追踪,分布式事务,等…...
机器学习之神经网络的层次
文章目录 神经网络组成神经网络根据结构分类神经网络的信号传递 神经网络组成 大脑是一个巨大的神经元网络,所以神经网络是一个节点网络。根据节点的连接方式,可以创建多种神经网络。最常用的神经网络类型之一采用了如图所示的节点分层结构 正方形节点组…...
力扣每日一题(+日常水几道题)
每日一题1333. 餐厅过滤器 - 力扣(LeetCode) 简单的按规则排序,去除几个不满足的条件然后排序返回即可 #include<algorithm> class Solution { public:vector<int> filterRestaurants(vector<vector<int>>& restaurants, …...
百度SEO不稳定的原因及解决方法(百度SEO不稳定因素的5大包括)
百度SEO优化不稳定介绍:蘑菇号-www.mooogu.cn 随着百度SEO算法的不断变化和升级,许多网站的SEO排名经常出现不稳定的情况,这种情况在一定程度上影响了网站的流量和排名,导致网站的质量评分降低。因此,深入分析百度SEO…...
深度学习(1)---卷积神经网络
文章目录 一、发展历史1.1 CNN简要说明1.2 猫的视觉实验1.3 新认知机1.4 LeNet-51.5 AlexNet 二、卷积层2.1 图像识别特点2.2 卷积运算2.3 卷积核2.4 填充和步长2.5 卷积计算公式2.6 多通道卷积 三、池化层 一、发展历史 1.1 CNN简要说明 1. 卷积神经网络(Convolut…...
探索社会工程的深度:从定义到高级攻击策略
在广阔的网络安全领域,社会工程作为一种微妙的威胁而出现,它利用人类的漏洞来访问敏感信息或实施欺诈。网络安全背景下的社会工程的定义很明确:它包括使用欺骗手段操纵个人泄露机密或个人信息,然后将这些信息用于欺诈目的。 此类…...
CTF 入门指南:从零开始学习网络安全竞赛
文章目录 写在前面CTF 简介和背景CTF 赛题类型介绍CTF 技能和工具准备好书推荐 写作末尾 写在前面 CTF比赛是快速提升网络安全实战技能的重要途径,已成为各个行业选拔网络安全人才的通用方法。但是,本书作者在从事CTF培训的过程中,发现存在几…...
Spring整合第三方框架
目录 Spring整合第三方框架 加载外部properties文件 自定义命名空间解析原理 自定义命名空间总结和案例需求 总结 案例 Spring整合第三方框架 加载外部properties文件 Spring整合第三方框架不像MyBatis那么简单了,例如Dubbo框架在与Spring框架整合时…...
Linux Shell 无vi获取文件某行指定内容和修改某行指定内容
注意:操作之前一定要先备份!!!一定要先备份!!!一定要先备份!!! 1. 获取某配置文件中某一行某项的值 cat /sshd_config |grep "PermitRootLogin" …...
在EXCEL中构建加载项之创建加载项的目的及规范要求
【分享成果,随喜正能量】一句南无阿弥陀佛,本是释迦牟尼佛所证的无上正等正觉法,洒在娑婆世界的众生海中,只为末世众生能够以信愿之心抓住此救命稻草,要知道今世人此生的处境,可能只剩这道要么极乐要么三涂…...
Hive【Hive(三)查询语句】
前言 今天是中秋节,早上七点就醒了,干啥呢,大一开学后空教室紧缺,还不趁着假期来学校等啥呢。顺便偷偷许个愿吧,希望在明年的这个时候,秋招不知道赶不赶得上,我希望拿几个国奖,蓝桥杯…...
商场做小程序商城的作用是什么?
商场是众多商家聚集在一起的购物公共场所,大商场也往往入驻着众多行业商家,是每个城市重要的组成部分。 随着互联网电商深入及客户消费行为改变,不少商场如今的客流量非常有限,甚至可以说是员工比客人多,这就导致撤店…...
XPD738协议系列-USB Type-C PD 和 Type-A 双口控制器
产品描述: XPD738 是一款集成 USB Type-C、USB Power Delivery(PD)2.0/3.0 以及 PPS、QC3.0/QC3.0/QC2.0 快充协议、华为 FCP/SCP/HVSCP 快充协议、三星 AFC 快充协议、BC1.2 DCP 以及苹果设备 2.4A 充电规范的多功能 USB Type-C 和 Type-A …...
【面试八股】IP协议八股
IP协议八股 子网掩码的作用为什么IP协议需要分片IP协议什么时候需要分片IP协议是怎么进行分片的那么IP协议是如果进行标识属于同一个分片呢?TCP协议和UDP协议将数据交给IP协议之后,是否需要分片传输? 子网掩码的作用 用来标识网络号和主机号…...
【冰糖R语言】创建R包(打包R程序)
目标:将现有R程序打包 可能涉及知识点:devtools包、usethis包、Rstudio软件 一、R包的类型 通常一个R包中包含以下元素: 1)R文件夹:函数代码 2)man文件夹:存放每个函数的注释文件 3&#x…...
照片后期处理软件DxO FilmPack 6 mac中文说明
DxO FilmPack 6 for Mac是一款照片后期处理软件。它可以模拟超过60种著名胶片品牌和类型的色彩和颗粒感,使照片具有复古、艺术和时尚风格。 DxO FilmPack 6 mac支持RAW和JPG格式的照片,并提供丰富的调整选项,如亮度、对比度、曝光、阴影和高…...
51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真+程序+原理图+报告+讲解视频)
51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真程序原理图报告讲解视频) 讲解视频1.主要功能:2.仿真3. 程序代码4.原理图5. 设计报告6. 设计资料内容清单 51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显…...
Scala第九章节
Scala第九章节 scala总目录 章节目标 理解包的相关内容掌握样例类, 样例对象的使用掌握计算器案例 1. 包 实际开发中, 我们肯定会遇到同名的类, 例如: 两个Person类. 那在不改变类名的情况下, 如何区分它们呢? 这就要使用到包(package)了. 1.1 简介 包就是文件夹, 用关…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
