单链表的插入和删除

一、插入操作

按位序插入(带头结点):

ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。

typedef struct LNode{ElemType data;struct LNode *next;
}LNode,*LinkList;//在第i 个位置插插入元素e (带头结点)
bool ListInsert(LinkList &L, int i,ElemType e){if( i<1)return false;LNode *p;    //指针p指向当前扫描到的结点int j=0;     //当前p指向的是第几个结点p = L;       //L指向头结点,头结点是第0个结点(不存数据)
while (p!=NULL &&j<i-1){  //循环找到第i-1个结点p=p->next;j++;
}if(p==NULL)      //i值不合法return false;
LNode *s = (LNode *)malloc(sizeof( LNode) ) ;
s->data = e;
s->next=p->next;
p->next=s;       //将结点s连到p之后      
return true;     //插入成功
}

注意:上述代码s->next=p->next与p->next=s不能颠倒。

按位序插入(不带头节点):

ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。

typedef struct LNode{ElemType data;struct LNode *next;
}LNode,*LinkList;//在第i 个位置插插入元素e (带头结点)
bool ListInsert(LinkList &L, int i,ElemType e){if( i<1)return false;if(i==1){    //插入第一个节点的操作与其他节点操作不同
LNode *s = ( LNode *)malloc(sizeof( LNode) ) ;s->data = e;s->next=L;L=s;            //头指针指向新结点return true;
}
LNode *p;           //指针p指向当前扫描到的结点
int j=1;            //当前p指向的是第几个结点
p = L;              // p指向第1个结点(注意:不是头结点)while (p!=NULL &&j<i-1){  //循环找到第i-1个结点p=p->next;j++;
}if(p==NULL)      //i值不合法return false;
LNode *s = (LNode *)malloc(sizeof( LNode) ) ;
s->data = e;
s->next=p->next;
p->next=s;       //将结点s连到p之后      
return true;     //插入成功
}

指定节点的后插操作:

typedef struct LNode{ElemType data;struct LNode *next;
}LNode,*LinkList;//后插操作:在p结点之后插入元素e
bool InsertNextNode ( LNode *p,ElemType e){if ( p==NULL)return false;LNode *s = ( LNode *)malloc(sizeof( LNode) ) ;if (s==NULL)    //内存分配失败return false;
s->data = e;      //用结点s保存数据元素e
s->next=p->next;
p->next=s;        //将结点s连到p之后
return true;
}

指定节点的前插操作:

//前插操作:在p结点之前插入元素e
bool InsertPriorNode (LNode *p,ElemType e)

无法找到他的前驱节点,可以传入头指针

//前插操作:在p结点之前插入元素e
bool InsertPriorNode ( LinkList L,LNode *p,ElemType e)

但如果不能传入头指针上述方法就不能使用,依然无法解决问题。

可以申请一个新的节点s作为p的后继节点,把p中的数据复制到s中再把插入的数据放到p中完成前插操作。如下图所示:

//前插操作:在p结点之前插入元素e
bool InsertPriorNode (LNode *p,ElemType e){if ( p==NULL)return false;LNode *s = ( LNode *)malloc(sizeof( LNode ) ) ;if ( s==NULL)      //内存分配失败return false;s->next=p->next;p->next=s;         //新结点s 连到p之后s->data=p->data;   //将p中元素复制到s中p->data=e;        // p中元素覆盖为ereturn true;
}

二、删除操作

按位序删除(带头结点):

ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。

typedef struct LNode{ElemType data;struct LNode *next;
}LNode,*LinkList;bool ListDelete( LinkList &L, int i,ElemType &e){if(i<1)return false;LNode *p;        //指针p指向当前扫描到的结点int j=0;         //当前p指向的是第几个结点p = L;           //L指向头结点,头结点是第0个结点(不存数据)
while (p !=NULL && j<i-1){      //循外找到第i-1个节点p=p->next;j++;
}
if( p==NULL)         //i值不合法return false;
if( p->next == NULL)           //第i-1个结点之后已无其他结点return false;
LNode *q=p->next;             //令q指向被删除结点
e = q->data;                 //用e返回元素的值
p->next=q->next;             //将*q结点从链中“断开
free(q);                     //释放结点的存储空间
return true;                 //删除成功
}

指定节点的删除:

//删除指定结点p
bool DeleteNode ( LNode *p)

方法1:传入头指针,循环寻找p 的前驱结点

方法2:类似于结点前插的实现

//删除指定结点p
bool DeleteNode ( LNode *p){if (p==NULL)return false;LNode *q=p->next;          //令q指向*p的后继结点p->data=p->next->data;    //和后继结点交换数据域p->next=q->next;          //将*q结点从链中“断开”free(q);                 //释放后继结点的存储空间return true;
}

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

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

相关文章

国内IP切换软件:解锁网络世界的新钥匙

在数字化快速发展的今天&#xff0c;互联网已成为我们生活中不可或缺的一部分。然而&#xff0c;伴随着网络使用的深入&#xff0c;许多用户逐渐意识到&#xff0c;不同的IP地址可能会带来截然不同的网络体验。为了应对这一问题&#xff0c;国内IP切换软件应运而生&#xff0c;…

iOS客户端自动化UI自动化airtest+appium从0到1搭建macos+脚本设计demo演示+全网最全最详细保姆级有步骤有图

Android客户端自动化UI自动化airtest从0到1搭建macos脚本设计demo演示全网最全最详细保姆级有步骤有图-CSDN博客 避坑系列-必读&#xff1a; 不要安装iOS-Tagent &#xff0c;安装appium -这2个性质其实是差不多的都是为了安装wda。注意安装appium最新版本&#xff0c;安装完…

结构体,联合体,枚举( 1 )

目录 前言 1.结构体 1.1结构体的声明 1.2结构体变量的创建和初始化 1.3结构体成员的访问字符 1.4结构体的内存大小 1.4.1对齐规则 1.5结构体传参 前言 在编程的世界里&#xff0c;数据结构的选择对于程序的效率和可读性有着至关重要的影响。不同的数据结构适用于不同的…

19. 变量

文章目录 一、变量二、变量的定义格式 一、变量 变量&#xff1a;程序中临时存储数据的容器&#xff0c;在程序执行过程中&#xff0c;其值有可能发生改变的量&#xff08;数据&#xff09;。但是这个容器中只能存一个值。 应用场景&#xff1a;在我们登录页面的时候&#xf…

C++多重继承与虚继承

多重继承的原理 多重继承(multiple inheritance)是指从多个直接基类中产生派生类的能力。 多重继承的派生类继承了所有父类的属性。 在面向对象的编程中&#xff0c;多重继承意味着一个类可以从多个父类继承属性和方法。 就像你有一杯混合果汁&#xff0c;它是由多种水果榨取…

46.continue语句

目录 一.continue语句 二.视频教程 一.continue语句 continue语句的作用和break语句很像&#xff0c;break语句会跳出当前循环&#xff0c;而continue语句则是跳出本次循环&#xff0c;继续执行下一次循环。 举个例子&#xff1a; #include <stdio.h>void main(void)…

蓝桥杯练习题总结(三)线性dp题(摆花、数字三角形加强版)

目录 一、摆花 思路一&#xff1a; 确定状态&#xff1a; 初始化&#xff1a; 思路二&#xff1a; 确定状态&#xff1a; 初始化&#xff1a; 循环遍历&#xff1a; 状态转移方程&#xff1a; 二、数字三角形加强版 一、摆花 题目描述 小明的花店新开张&#xff0c;为了吸…

计算机组成原理 — 指令系统

指令系统 指令系统指令的概述指令的格式指令的字长取决于 操作数类型和操作种类操作数的类型数据在存储器中的存放方式操作类型 寻址方式指令寻址数据寻址立即寻址直接寻址隐含寻址间接寻址寄存器寻址寄存器间接寻址基址寻址变址寻址堆栈寻址 RISC 和 CISC 技术RISC 即精简指令…

「AI作曲家」Suno 使用 v3 在几秒钟内创作完整的两分钟歌曲

Suno 被誉为“音乐界的 ChatGPT”,它的独特之处在于能够根据简单的提示,自主创作包括歌词、人声和配器在内的完整音乐作品。更令人惊叹的是,你可以引导它精确地选择任何想要的音乐风格,从古老的三角洲蓝调到现代的电子寒潮,它还能灵活运用各种方言。 Suno 正在开启一个全…

【学习笔记】java项目—苍穹外卖day01

文章目录 苍穹外卖-day01课程内容1. 软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境 2. 苍穹外卖项目介绍2.1 项目介绍2.2 产品原型2.3 技术选型 3. 开发环境搭建3.1 前端环境搭建3.2 后端环境搭建3.2.1 熟悉项目结构3.2.2 Git版本控制3.2.3 数据库环境搭建3.2.4 前…

使用certbot为网站启用https

1. 安装certbot客户端 cd /usr/local/bin wget https://dl.eff.org/certbot-auto chmod ax ./certbot-auto 2. 创建目录和配置nginx用于验证域名 mkdir -p /data/www/letsencryptserver {listen 80;server_name ~^(?<subdomain>.).ninvfeng.com;location /.well-known…

【Linux】 centos7安装卸载SQL server(2017、2019)

一、安装配置 准备一个基础Linux配置&#xff1a; 内存为20GB 运行内存为2GB的系统&#xff08;数据库小于2GB安装不了&#xff09; 1、网络配置 我们需要进行网络的连接 进入 cd /ect/sysconfig/network-script/ 编辑文件ifcfg-ens33 vi ifcfg-ens33 Insert键进行编辑 把ONBOO…

2024最新Win系统下VSCode下载安装与配置C/C++教程

2024最新Win系统下VSCode下载安装与配置C/C教程 文章目录 2024最新Win系统下VSCode下载安装与配置C/C教程1、下载安装VSCode2、安装运行时环境GCGC的环境配置 3、安装VSCode插件4、配置程序调试环境4.1确定文件存储路径4.2新建文件夹【.vscode】4.3在.vscode文件夹里新建四个配…

学透Spring Boot — [二] Spring 和 Spring Boot的比较

欢迎关注我们的专栏 学透 Spring Boot 一、创建一个简单Web应用 本篇文章&#xff0c;我们将会比较 Spring 框架和 Spring Boot 的区别。 什么是 Spring? 也许你在项目中已经可以很熟练的使用 Spring 了&#xff0c;但是当被问到这个问题时&#xff0c;会不会犹豫一下&#…

轻松赚钱,精彩生活:上班族副业赚钱新攻略大揭秘!

薪水总是捉襟见肘&#xff0c;每月账单总让人倍感压力。你是否曾在静谧的夜晚&#xff0c;躺在床上&#xff0c;思索如何为家庭多赚一分钱&#xff1f;其实&#xff0c;你并不孤单。在这个充满机遇与挑战的时代&#xff0c;越来越多的人开始寻找副业&#xff0c;以期望让生活更…

QT控件之显示控件

Qt Designer显示窗口部件提供的面板中&#xff0c;提供了10种显示小部件 &#xff08;1&#xff09; Label标签 &#xff08;2&#xff09; Text Browser文本浏览器 &#xff08;3&#xff09; Graphics View图形视图 &#xff08;4&#xff09; Calendar Widget日历 &…

【Bug-ModuleNotFoundError: No module named ‘models‘】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 出现这个错误&#xff1a; 出现了ModuleNotFoundError: No module named models’的问题。 文件在Model…

【操作系统复习之路】操作系统概述(复习的同学有福啦)

长话短说&#xff0c;就记下笔记&#xff0c;期待期末90&#xff0c;随便希望能帮助到有需要的同学。 目录 一、操作系统的目标和作用 二、操作系统的发展过程 2.1 无OS 2.2 有OS 【1】批处理系统 【2】分时系统 【3】实时操作系统 【4】三种基本操作系统的比较&#…

域环境共享文件夹,容量配额管理

首先&#xff0c;我们先创建一个新的磁盘&#xff0c;必须在服务器关机的状态下创建&#xff0c;只有在关机状态下才能创建NVMe类型的磁盘。 打开此电脑&#xff0c;右击创建的磁盘&#xff0c;点击属性。 点击共享&#xff0c;点击高级共享。 将共享此文件夹勾选上&#xff0c…

从代码到可执行到运行的整体流程与原理

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言 本篇文章将会介绍&#xff0c;磁盘中是如何存储一个文件&#xff0c;磁盘中的文件是如何从磁盘中加载进内存&#xff0c;与进程又有怎样的关系&#xff0c;我们写的代码变成可执行程序执行起来时如何完成对文件的一系列…