链表指定节点的插入

news2024/11/26 11:53:52

 向现有链表中插入结点,根据插入位置的不同,可分为以下 3 种情况:

  1. 插入到链表的头部,作为新的链表中第一个存有数据的结点(又称为”首元结点”);
  2. 插入到链表中某两个结点之间的位置;
  3. 插入到链表的最末端的位置;

使用头插法和尾插法可分别解决第 1 和第 3 种情况,但是无法解决第 2 种情况,所以本节给大家一段通用代码,可有效解决所有链表结点插入的问题。(分为节点前和节点后)

节点后插入

节点后插入分为以下几个步骤:

1.通过查找代码找到指定节点;

2.定义一个新节点,将指定节点的下一个节点地址赋给新节点

3.将新节点地址赋给指定节点的下一个节点

定义一个查找函数

int searchLink(struct Test *head,int Data)
{
        while(head != NULL)
        {
                if(head->Data == Data)//输入的节点值刚好等于链表节点值
                {
                        return 1;
                }
                head = head->next;
        }
        return 0;
}

定义一个节点后插入函数

int insertFronBehind(struct Test *head,int Data,struct Test *new)
{
        struct Test *p = head;
        while(p != NULL)
        {
                if(p->Data == Data)
                {
                        new->next = p->next;//指定节点的下一个节点地址赋给新节点
                        p->next = new;//将新节点地址赋给指定节点的下一个节点
                        return 1;
                }
                p=p->next;
        }
        return 0;
}

主函数中创建一个新节点并调用以上两个函数

        struct Test new={99,NULL};
        printLink(&t1);
        puts("after insert behind");
        insertFronBehind(&t1,3,&new);
        printLink(&t1);

这里是在原链表第三个节点处插入一个99,编译结果如下


节点前插入

节点前插入分为以下两种情况:

第一种是链表头插入,则链表头插入的地址改变了整个链表的地址,所以链表头插入的地址可以作为整个链表首地址,同时往下延申即可,就可以得到链表中的所有数据;

第二种是链表中插入,链表中插入的步骤是:

1.若p节点的下一个节点数据等于要插入的节点数据,则将插入的节点地址赋给新节点

2.将p节点地址赋新节点

定义一个查找函数

int searchLink(struct Test *head,int Data)
{
        while(head != NULL)
        {
                if(head->Data == Data)//输入的节点值刚好等于链表节点值
                {
                        return 1;
                }
                head = head->next;
        }
        return 0;
}

定义一个节点前插入函数(分两种情况)

struct Test* insertFromfor(struct Test *head,int Data,struct Test *new)
{
        struct Test *p = head;
        if(p->Data == Data)//p的地址刚好的输入的地址,即链表头插入
        {
                new->next = head;
                return new;
        }
        while(p->next != NULL)//p的下一个不为空指针,如果为空指针就跳出循环,判断是不是在链表头
        {
                if(p->next->Data == Data)//p的下一个节点数据等于插入节点数据
                {
                        new->next=p->next;//p下一个节点地址给新节点
                        p->next=new;//新节点地址给p
                        printf("Insert ok\n");
                        return head;
                }
                p=p->next;
        }
        printf("No this data%d\n",Data);
        return head;
}

主函数创建一个新节点调用上面两个函数

        struct Test new1={111,NULL};
        struct Test *head=NULL;
        head = &t1;//若为链表头,则需要作为链表首地址;若不为链表头,就从t1正常输出
        printLink(head);
        head=insertFromfor(head,3,&new);
        printLink(head);

这里是在3前面插入一个111,编译结果如下:

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

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

相关文章

通达信对子数的指标公式大全

对子数:形如9.22,12.21, 4.44,11.00等 顺子数:形如3.89,4.98,7.56等 进一步的了解,自行百度。 在通达里查找价格为对子数的个股,有两个自带的函数, INTPART(X),返回数值的整数部分, FRACPART&#xff…

安达发|APS生产排程解决五金制造企业的需求

在五金制造行业中,生产排程一直是一个非常重要的环节。然而,由于五金行业的特点和痛点,传统的生产排程方法往往难以满足企业的需求。本文将针对五金行业的痛点,探讨如何利用APS生产排程解决这些问题。 首先,我们需要了…

代码随想录二刷Day 56

1143.最长公共子序列 本题和动态规划:718. 最长重复子数组 (opens new window)区别在于这里不要求是连续的了,但要有相对顺序,即:"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcd…

大模型时代目标检测任务会走向何方?

参考: 大模型时代目标检测任务会走向何方? 细数从常见的目标检测到现在 MLLM 盛行的时代,和 Object Detection 的任务以及近期涌现的新任务。>>加入极市CV技术交流群,走在计算机视觉的最前沿 你或许很好奇,现在…

人工智能时代八大类算法你了解吗?(文末包邮送书6本)

文章目录 本文导读1. 关联规则分析2. 回归分析3. 分类分析4. 聚类分析5. 集成学习6. 自然语言处理7. 图像处理8. 深度学习9. 书籍推荐(包邮送书6本) 本文导读 从零带你了解人工智能时代需要掌握的8大类算法,包括基础理论、关联规则分析、回归…

Vue 创建自定义 ref 函数

Vue 创建自定义 ref 函数 customRef customRef 用于:创建一个自定义的 ref 函数,并对其依赖项跟踪和更新触发进行显式控制。 使用 customRef 创建自定义 ref 函数 // 创建自定义 ref 函数 function myRef(value) {return customRef((track, trigger) &g…

自动曝光算法(第一讲)

序言 失业在家无事,想到以后换方向不做自动曝光了,但是自动曝光的工作经验也不能浪费了,准备写一个自动曝光的教学,留给想做自动曝光的小伙伴参考。笔者当时开发自动曝光没有按摄影的avtvevbvsv公式弄,而是按正确的增…

[架构之路-251/创业之路-82]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 商业智能、决策支持系统、知识管理

目录 前言: 一、企业信息化的结果:常见企业信息化软件 1.1 商业智能 - 管理层 1.1.1 什么是商业智能What 1.1.1.1 商业智能常见工具 1.1.2 为什么需要商业智能Why? 1.1.3 谁需要商业智能who? 1.1.4 商业智能在企业管理中的…

微信小程序开发(搭建)

首先去微信开发者网站下载微信开发者工具 然后打开电脑命令框wincmd 全局安装 vue-clinpm install --global vue-cli创建一个基于 mpvue-quickstart 模板的新项目vue init mpvue/mpvue-quickstart my-project安装依赖cd my-projectnpm install启动构建npm run dev 记得为vue配…

Docker dnmp 多版本php安装 php8.2

Laravel9 开发需要用到php8.1以上的版本,而dnmp只支持到php8.0。安装php8.2的步骤如下: 1. 从/services/php80目录复制一份出来,重命名为php82,extensions目录只保留 install.sh 和 install-php-extensions 这两个文件 2. 修改.en…

C++使用栈实现简易计算器(支持括号)

使用C实现&#xff0c;使用系统自带stac 支持括号处理支持小数计算支持表达式有效性检查支持多轮输入。 运行结果示例&#xff1a; 代码&#xff1a; #include <iostream> #include <stack> #include <string> using namespace std;//判断是否是数字字符 …

手动仿射变换

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码目的&#xff1a;学习与总结 demo解决问题&#xff1a;通过仿射控件vtkAffineWidget对目标actor进行手动的拖拽的仿射变换 关键类&#xff1a;vtkAffineWi…

PostGIS轨迹分析——简化轨迹

需求 对轨迹线进行简化,并将原始轨迹上的两个特征点拉取到简化后的轨迹上 简化线 红色线是简化后的轨迹线,蓝色线是原始轨迹,有两个特征点 知识点: st_makeline函数将点连成线st_simplify简化线函数,其中第二个参数为坐标系的单位,0.002度大概代表0.002x1.11x10^5≈22…

使用 ElementUI 组件构建 Window 桌面应用探索与实践(WinForm)

零、实现原理与应用案例设计 1、原理 基础实例 Demo 可以参照以下这篇博文&#xff0c; 基于.Net CEF 实现 Vue 等前端技术栈构建 Windows 窗体应用-CSDN博客文章浏览阅读291次。基于 .Net CEF 库&#xff0c;能够使用 Vue 等前端技术栈构建 Windows 窗体应用https://blog.c…

通过xshell传输文件到服务器

一、user is not in the sudoers file. This incident will be reported. 参考链接&#xff1a; [已解决]user is not in the sudoers file. This incident will be reported.(简单不容易出错的方式)-CSDN博客 简单解释下就是&#xff1a; 0、你的root需要设置好密码 sudo …

java 申请堆外内存吗? java如何使用堆外内存?

java 申请堆外内存吗&#xff1f; java如何使用堆外内存&#xff1f; Java堆外内存管理 JVM可以使用的内存分外2种&#xff1a;堆内存和堆外内存&#xff1a; 堆内存完全由JVM负责分配和释放&#xff0c;如果程序没有缺陷代码导致内存泄露&#xff0c;那么就不会遇到java.lan…

【DriveGPT学习笔记】自动驾驶汽车Autonomous Vehicle Planning

原文地址&#xff1a;DriveGPT - Lei Maos Log Book 自动驾驶汽车的核心软件组件是感知、规划和控制。规划是指在给定场景或一系列场景的情况下为自动驾驶汽车制定行动计划的过程&#xff0c;以实现安全和理想的自动驾驶。 用于规划的场景是从感知软件组件获得的。计划的行动将…

Node学习笔记之跨域

1.跨域是什么&#xff1f; 跨域&#xff0c;是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的&#xff0c;是浏览器对JavaScript实施的安全限制。 同源策略限制了一下行为&#xff1a; Cookie无法读取DOM 和 JS 对象无法获取Ajax请求发送不出去 同源是指&#…

如何通过 NAT 模式连接VMware虚拟机以及存在和不存在ens33文件的解决方案

文章目录 前言1 VMware配置1.1 打开vmvare虚拟网络编辑器1.2 取消使用本地DHCP1.3 NAT设置 2 虚拟机的配置2.1 存在ens332.2.1 修改ifcfg-ens33文件2.2.1.1 为什么设置BOOTPROTOstatic&#xff1f;2.2.1.2 如何选择使用static还是dhcp&#xff1f; 2.2.2 关闭防火墙 2.2 不存在…

王道p18 3.对长度为n的顺序表L,编写一个时间复杂度为 O(n)、空间复杂度为 O(1)的算法,该算法删除线性表中所有值为x的数据元素。(c语言代码实现)

视频讲解在这里&#xff08;谢谢各位大佬&#xff09; &#x1f447; p18 第三题数据结构课后算法题_哔哩哔哩_bilibili 本题代码如下 void deletex(struct sqlist* s, int x) {int k 0;int i 0;for (i 0; i < s->length; i){if (s->a[i] ! x)//只要不等于x&…