对一个双向链表,从尾部遍历找到第一个值为x的点,将node p插入这个点之前,如果找不到,则插在末尾。使用C语言实现

以下是一个用C语言实现的双向链表(Doubly Linked List)插入操作的代码。该代码从尾部遍历找到第一个值为x的节点,并在其前插入新节点p,或者在未找到时将其插入链表末尾。

 #include <stdio.h>
#include <stdlib.h>// 定义双向链表节点结构
typedef struct DoublyListNode {int val;struct DoublyListNode *prev;struct DoublyListNode *next;
} DoublyListNode;// 创建新节点
DoublyListNode* createNode(int val) {DoublyListNode *newNode = (DoublyListNode*)malloc(sizeof(DoublyListNode));newNode->val = val;newNode->prev = NULL;newNode->next = NULL;return newNode;
}// 在双向链表中插入新节点
DoublyListNode* insertBeforeXOrAppend(DoublyListNode *head, int x, int pVal) {if (head == NULL) {// 如果链表为空,直接创建新节点并返回return createNode(pVal);}DoublyListNode *curr = head;// 从头部开始遍历直到尾部while (curr->next != NULL) {curr = curr->next;}// 从尾部开始向前遍历找到第一个值为x的节点while (curr != NULL && curr->val != x) {curr = curr->prev;}// 如果找到了值为x的节点if (curr != NULL) {DoublyListNode *newNode = createNode(pVal);newNode->next = curr->next;newNode->prev = curr;if (curr->next != NULL) {curr->next->prev = newNode;}curr->next = newNode;} else {// 如果没有找到值为x的节点,则插入到末尾DoublyListNode *newNode = createNode(pVal);newNode->prev = curr; // curr此时为链表的最后一个节点或NULL(当链表为空时,但这种情况已在开头处理)if (curr != NULL) {curr->next = newNode;}// 如果链表原本为空,则newNode既是头节点也是尾节点,无需额外设置head// 否则,head不变,因为新节点是插入到末尾的,不影响头节点}// 注意:此函数不改变头节点的地址,因此无需返回新的头节点(除非链表原本为空)// 但为了保持接口的一致性,这里仍然返回头节点(尽管它可能没变)return head; // 在这个特定实现中,头节点要么不变,要么在函数外部已经处理(如链表为空时)
}// 打印双向链表
void printList(DoublyListNode *head) {DoublyListNode *curr = head;while (curr != NULL) {printf("%d ", curr->val);curr = curr->next;}printf("\n");
}// 释放双向链表内存
void freeList(DoublyListNode *head) {DoublyListNode *curr = head;while (curr != NULL) {DoublyListNode *next = curr->next;free(curr);curr = next;}
}int main() {// 创建双向链表 1 <-> 2 <-> 3 <-> 4DoublyListNode *head = createNode(1);head->next = createNode(2);head->next->prev = head;head->next->next = createNode(3);head->next->next->prev = head->next;head->next->next->next = createNode(4);head->next->next->next->prev = head->next->next;int x = 3;int pVal = 99;// 插入新节点insertBeforeXOrAppend(head, x, pVal);// 打印双向链表printList(head);// 释放双向链表内存freeList(head);return 0;
}

注意:

  1. 上述代码中的insertBeforeXOrAppend函数实际上不需要返回新的头节点地址,因为插入操作要么在链表末尾进行(不改变头节点),要么在链表中间进行(同样不改变头节点)。但是,为了保持函数接口的一致性(比如,如果以后需要修改这个函数以处理链表为空时的特殊情况,并返回新的头节点),这里仍然返回了头节点。在实际应用中,如果确定头节点不会改变,可以省略返回值。

  2. 在main函数中,我们创建了一个简单的双向链表,并调用了insertBeforeXOrAppend函数来插入新节点。然后,我们打印链表并释放其内存。

带头链表:在链表的首部增加一个不存储有效数据的头节点。头节点的作用主要是简化链表的操作,特别是在处理空表时,无论表是否为空,头指针都指向头节点,从而使得空表和非空表的操作一致。
带头单向非循环链表:结构简单,但一般不会单独用来存储数据,而是作为其他数据结构的子结构,如哈希桶、图的邻接表等。
带头双向循环链表:结构最复杂,但一般用在单独存储数据的场景。实际中使用的链表数据结构,很多都是带头双向循环链表。虽然结构复杂,但使用代码实现后会发现,这种结构能带来很多优势。

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

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

相关文章

【操作系统不挂科】操作系统期末考试题库<1>(单选题&简答题&计算与分析题&应用题)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 操作系统不挂科 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 一.单项选择题&#xff08;每个空2分&#xff0c;共40分&#xff09; 1. 计算机的操作系统是一种&#xff08; B &#xff09;。 A. 应用软件…

Excel重新踩坑5:二级下拉列表制作;★数据透视表;

0、在excel中函数公式不仅可以写在单元格里面&#xff0c;还可以写在公式里面。 1、二级下拉列表制作&#xff1a; 2、数据透视表&#xff1a; 概念&#xff1a;通过拖拉就能实现复杂函数才能实现的数据统计问题。 概览&#xff1a;在插入选项中有个数据透视表&#xff0c;数…

【赵渝强老师】MongoDB写入数据的过程

在MongoDB数据更新时&#xff0c;WiredTiger存储引擎使用预写日志的机制先将数据更新写入到Journal日志文件中。然后在创建检查点操作开始时&#xff0c;再将日志文件中记录的操作刷新到数据文件。换句话说&#xff0c;通过预写日志和检查点机制可以保证将数据更新持久化到数据…

【双层模型】考虑供需双侧的综合能源双层优化模型

目录 主要内容 内容研究 1.模型简介 2 程序释义 部分代码 运行结果 下载链接 主要内容 该程序实现一个综合能源系统的优化调度双层模型&#xff0c;上下层分别采用差分进化算法和规划算法进行求解。模型考虑了多种能源设备&#xff0c;包括燃气轮机、燃气锅炉、风电…

Linux驱动开发(16):输入子系统–电容触摸驱动实验

有关电容触摸的基础知识内容可以参考野火STM32相关教程&#xff0c;这里只介绍电容触摸驱动的相关内容。 本章配套源码、设备树以及更新固件位于“~/embed_linux_driver_tutorial_imx6_code/linux_driver/touch_scream_GTxxx”目录下。 触摸面板通过双面胶粘在显示屏上&#…

QML自定义滑动条Slider的样式

代码展示 import QtQuick 2.9 import QtQuick.Window 2.2 import QtQuick.Controls 2.1Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Slider {id: controlvalue: 0.5background: Rectangle {x: control.leftPaddingy: control.topPadding …

【项目开发】C#环境配置及VScode运行C#教程(学生管理系统)

原创文章,禁止转载。 文章目录 下载.NETVScode配置运行程序下载.NET 官网链接: https://dotnet.microsoft.com/en-us/download选择任意版本下载: 下载完成后,双击运行exe文件,等待安装完成。 在控制台输入: dotnet --version若出现版本信息,说明安装成功: VScode配…

卡码网 ACM答题编程模板

背景&#xff1a; input() 在 ACM 编程中的底层调用原理 1. input() 的核心原理 在 Python 中&#xff0c;input() 的底层实现依赖于标准输入流 sys.stdin。每次调用 input() 时&#xff0c;Python 会从 sys.stdin 中读取一行字符串&#xff0c;直到遇到换行符 \n 或文件结束…

Linux驱动开发(18):linux驱动并发与竞态

并发是指多个执行单元同时、并行执行&#xff0c;而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问 则很容易导致竞态。对于多核系统&#xff0c;很容易理解&#xff0c;由于多个CPU同时执行&#xff0c;多个CPU同时读、写共享资源时很容易造成竞态。…

k8s基础(3)—Kubernetes-Deployment

一、 Deployment概述 ‌ Kubernetes Deployment‌是Kubernetes中的一个核心概念&#xff0c;它是一种高级别的控制器&#xff0c;用于管理Pod和ReplicaSet&#xff0c;确保应用程序的高可用性和稳定性。Deployment通过声明式配置来创建和更新Pod和ReplicaSet&#xff0c;从而…

windows11(或centos7)安装nvidia显卡驱动、CUDA、cuDNN

本文是我瞎搞时写的问题汇总及参考文献&#xff0c;记录了一些问题解决的进度及对问题的思考。 最近一次更新时间&#xff1a;2025年1月4日 一、安装或更新nvidia显卡驱动 首先&#xff0c;需要确保你的设备安装了最新的显卡驱动。 &#xff08;1&#xff09;centos7安装显…

【光纤通信】光纤结构

光纤结构主要由折射率较高的纤芯&#xff08;core&#xff09;部分和折射率较低的包层&#xff08;cladding&#xff09;部分以及涂覆层&#xff08;buffer coating&#xff09;组成。 光纤的分类方法有很多种&#xff0c;如按纤芯折射率分布、按纤芯结构、按二次涂覆层结构、按…

急需升级,D-Link 路由器漏洞被僵尸网络广泛用于 DDoS 攻击

僵尸网络活动增加 &#xff1a;新的“FICORA”和“CAPSAICIN”僵尸网络&#xff08;Mirai 和 Kaiten 的变体&#xff09;的活动激增。 被利用的漏洞 &#xff1a;攻击者利用已知的 D-Link 路由器漏洞&#xff08;例如 CVE-2015-2051、CVE-2024-33112&#xff09;来执行恶意命…

Eplan 项目结构(高层代号、安装地点、位置代号)

Eplan中的项目结构分为3个层次&#xff1a; &#xff08;1&#xff09;功能面结构。指明这个系统的功能&#xff0c;有什么用途。在EPlan中&#xff0c;指的就是"高层代号&#xff08;&#xff09;"。 一般指的是线体。 &#xff08;2&#xff09;位置面结构。指明该…

网络安全之高防IP的实时监控精准防护

高防IP是一种网络安全设备&#xff0c;用于保护网络服务不受到各类攻击的影响&#xff0c;确保业务的持续稳定运行。它通过监控、识别和封锁恶意攻击流量&#xff0c;提供高级别的防护&#xff0c;降低业务被攻击的风险&#xff0c;并提升网络的稳定性和可靠性。 一、实时监控的…

RabbitMQ实现生产者消费者

一.启动MQ 注意管理员身份进入cmd才行,我这里是在本地安装的MQ,推荐使用虚拟机安装 二.思路 官方解释RabbitMQ结构: 自我理解RabbitMQ结构: 其实RabbitMQ的服务器就像邮局一样,我们的生产者和消费者对于这个服务器来说都是消费者,因为服务器都可以向两者发送消息 环境准备 …

【计算机视觉技术 - 人脸生成】2.GAN网络的构建和训练

GAN 是一种常用的优秀的图像生成模型。我们使用了支持条件生成的 cGAN。下面介绍简单 cGAN 模型的构建以及训练过程。 2.1 在 model 文件夹中新建 nets.py 文件 import torch import torch.nn as nn# 生成器类 class Generator(nn.Module):def __init__(self, nz100, nc3, n…

matlab中高精度计算函数vpa与非厄米矩阵本征值的求解

clear;clc;close all tic %并行设置% delete(gcp(nocreate));%关闭之前的并行 cparcluster(local); c.NumWorkers50;%手动设置线程数(否则默认最大线程为12) parpool(c, c.NumWorkers); %并行设置%w1; u2.5;N30;valstozeros(2*N2,100); v10linspace(-3,3,100).;parfor jj1:leng…

旧服务改造及微服务架构演进

旧服务改造及微服务架构演进 微服务架构演进1.微服务架构2.微服务架构的特点3.单体架构与微服务架构之间的对比4.微服务架构演进历程 旧服务改造1. 微服务拆分的一些通用原则2.微服务拆分策略&#xff08;1&#xff09;功能维度拆分策略&#xff08;2&#xff09;非功能维度拆分…

springmvc--请求参数的绑定

目录 一、创建项目&#xff0c;pom文件 二、web.xml 三、spring-mvc.xml 四、index.jsp 五、实体类 Address类 User类 六、UserController类 七、请求参数解决中文乱码 八、配置tomcat,然后启动tomcat 1. 2. 3. 4. 九、接收Map类型 1.直接接收Map类型 &#x…