单链表的插入和删除

一、插入操作

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

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中元素覆盖为e
       return 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

String类相关oj练习

1.第一次只出现一次的字符 做题首先看清要求和提示&#xff1a; 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 提示&#xff1a; 1 < s.length < 105s 只包含小写字母 这就要用到我们所学…

win11 查看 wifi 密码

** win11 查看 wifi 密码 ** 第一种方法&#xff1a; 1.点击桌面左下角的开始菜单&#xff0c;选择“设置”。 2.在网络和internet中选择“高级网络设置”。 3.在相关设置下方点击“更多网络适配器选项”。 4.右击“WLAN”&#xff0c;在WLAN信息窗口点击“状态”。 5.…

月入10.5k;36岁生物专业转行网优,选择真的比努力更重要!

张雪峰说&#xff1a;普通家庭的孩子选择专业首要要考虑的是能不能就业&#xff1f;能不能拿到高薪&#xff1f;因为除了你的父母&#xff0c;没人会对你的未来负责。 学历和专业哪个更重要&#xff1f;不同的人往往会有不同的解答&#xff0c;今天故事的主人公H先生毕业于武汉…

关于使用vscode搭建c/c++编程环境

目录 关于使用vscode搭建c/c编程环境一、前言二、安装 IDE 二、安装TDM-GCC安装三、安装C/C环境四、编写代码并进行编译 关于使用vscode搭建c/c编程环境 一、前言 一直觉得vscode是生产强有力的生产工具&#xff0c;基于此&#xff0c;做一篇学习笔记进行记录。 二、安装 ID…

centos7系统下nginx1.24.0升级

如果没有这些目录&#xff0c;请先创建: mkdir /data/software mkdir /data/program提前下载所需的软件&#xff1a; cd /data/software wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz wget https://nginx.org/download/nginx-1.24.0.tar.gz安装nginx cd /data/soft…

正弦实时数据库(SinRTDB)使用(3)-用户管理

通过实时数据库管理工具登录后&#xff0c;在头部功能区的用户管理或左侧导航菜单的用户管理都可以打开用户管理功能界面&#xff0c;用户管理功能界面展示在中部主窗口区。 用户管理界面如下所示&#xff1a; 用户管理顶部包含刷新、添加用户、修改角色、修改密码及删除用户等…

【CASS精品教程】CASS添加标准图幅(50×50cm+50×40cm)

大比例尺地形图图幅一般分为正方形和矩形分幅两种,本文讲解CASS中添加标准图幅(5050cm、5040cm)的方法。 文章目录 一、CASS参数配置二、添加标准图幅(5050cm)三、添加标准图幅(5040cm)打开基于CASS自带案例数据study.dat绘制好的地形图study.dwg,如下图所示,下面来演示两种…

近年来,常见5大软件开发项目管理工具

时代进步&#xff0c;技术进步&#xff0c;汇总下近几年5大常用的软件开发项目管理工具。 1、微软项目管理软件 Microsoft Project&#xff08;或MSP&#xff09;是由微软开发销售的项目管理软件程序。软件设计目的在于协助项目经理制定发展计划、为任务分配资源、跟踪进度、管…

2024年给Mac电脑提速小妙招

经常听到小伙伴在抱怨PC电脑很慢&#xff0c;但是其实Mac电脑随着用的时间增长&#xff0c;运行速度也会越来越慢&#xff0c;那么造成Mac运行慢的原因有很多&#xff0c;可能是操作系统过时未更新&#xff0c;也可能是内存&#xff08;RAM&#xff09;不足&#xff0c;以下小编…

IDEA2023版本整合SpringBoot热部署

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…

Avue-crud表格操作栏不显示修改、删除按钮

2024-03-28 奇了怪了&#xff0c;CSDN自动把我之前的文章设置为VIP了&#xff0c;怪不得有时候搜东西看着看着要收费&#xff0c;现在找东西都不好找&#xff0c;我已经反馈不同意了&#xff0c;看看能不能给我取消吧 今天用Avue的时候发现操作栏的按钮没了&#xff0c;按照文…

mysql进阶查询

按关键字排序 PS:类比于windows 任务管理器 使用 SELECT 语句可以将需要的数据从 MySQL 数据库中查询出来&#xff0c;如果对查询的结果进行排序&#xff0c;可以使用 ORDER BY 语句来对语句实现排序&#xff0c;并最终将排序后的结果返回给用户。这个语句的排序不光可以针对某…

vue3动态绑定style

vue3动态绑定style :style"{属性名&#xff1a;变量}"直接引用对象 :style"对象"绑定一个含多个样式的数组 :style"[styleA, styleB]" :style“{属性名&#xff1a;变量}” 变量的赋值可以根据自己的业务做出调整 直接引用对象 :style“对象”…

Transformer的前世今生 day06(Self-Attention和RNN、LSTM的区别)

Self-Attention和RNN、LSTM的区别 RNN的缺点&#xff1a;无法做长序列&#xff0c;当输入很长时&#xff0c;最后面的输出很难参考前面的输入&#xff0c;即长序列会缺失上文信息&#xff0c;如下&#xff1a; 可能一段话超过50个字&#xff0c;输出效果就会很差了 LSTM通过忘…

fuzzywuzzy,一个好用的 Python 库!

目录 前言 安装 基本功能 1. 字符串相似度比较 2. 模糊匹配与排序 实际应用场景 1. 数据清洗 2. 文本匹配与搜索 3. 搜索引擎优化 总结 前言 大家好&#xff0c;今天为大家分享一个好用的 Python 库 - fuzzywuzzy Github地址&#xff1a;https://github.com/seatgeek/fu…

计算机网络基础——网络安全/ 网络通信介质

chapter3 网络安全与管理 1. 网络安全威胁 网络安全&#xff1a;目的就是要让网络入侵者进不了网络系统&#xff0c;及时强行攻入网络&#xff0c;也拿不走信息&#xff0c;改不了数据&#xff0c;看不懂信息。 事发后能审查追踪到破坏者&#xff0c;让破坏者跑不掉。 网络…

MySQL进阶-----索引的语法与SQL性能分析

目录 前言 一、索引语法 1.SQL语法 2.案例演示 二、SQL性能分析 三、慢查询日志 1.开启日志 2.测试样例 四、profile详情 1.开启profile 2.profile测试SQL语句 五、explain详情 1.语法结构 2.执行顺序示例&#xff08;id&#xff09; 3.执行性能示例(type) 前言 本…

常用的苹果应用商店上架工具推荐

摘要 移动应用app上架是开发者关注的重要环节&#xff0c;但常常会面临审核不通过等问题。为帮助开发者顺利完成上架工作&#xff0c;各种辅助工具应运而生。本文探讨移动应用app上架原理、常见辅助工具功能及其作用&#xff0c;最终指出合理使用工具的重要性。 引言 移动应…

考研数学|汤家凤1800基础部分要做完吗?

我教你一个方法&#xff0c;保证让你高质量的做完1800基础部分&#xff0c;而且还不用把所有题目都做了 我当然不是教你如何投机取巧&#xff0c;投机取巧是考不了高分的&#xff0c;我教你的都是我在实际考研过程中实际运用到的方法&#xff01; 其实这个方法也是我在二战的时…

StatefulBuilder 和 Builder

前言 果然了解的越多&#xff0c;越发现自己狗屁都不是。StatefulBuilder 和 Builder 之前真的不知道。还是在 对话框状态管理 中了解到了这两个东西。 简介 以下内容来自通义灵码 在Flutter中&#xff0c;StatefulBuilder 和 Builder 都是用来动态构建 widget 树的组件&am…