单链表的插入和删除

news2024/9/21 14:15:45

一、插入操作

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

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;
}

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

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

相关文章

江协科技STM32:按键控制LED光敏传感器控制蜂鸣器

按键控制LED LED模块 左上角PA0用上拉输入模式&#xff0c;如果此时引脚悬空&#xff0c;PA0就是高电平&#xff0c;这种方式下&#xff0c;按下按键&#xff0c;引脚为低电平&#xff0c;松下按键&#xff0c;引脚为高电平 右上角PA0&#xff0c;把上拉电阻想象成弹簧 当按键…

2024年天府杯A题论文免费分享,全网首发

天府杯免费分享资料&#xff08;A题论文代码&#xff09;链接&#xff1a;https://pan.baidu.com/s/17QtYt036ORk1xGIDi0JSew 提取码&#xff1a;sxjm 摘要 在近年来&#xff0c;随着科技的快速发展和社会经济的不断进步&#xff0c;科学研究的作用和地位日益凸显。本文基于…

通过WSL在阿里云上部署Vue项目

参考&#xff1a; 阿里云上搭建网站-CSDN博客 云服务器重装 关闭当前运行实例 更换操作系统&#xff0c;还有其他的进入方式。 选择ubuntu系统&#xff08;和WSL使用相同的系统&#xff09;。 设置用户和密码。发送短信验证码。 新系统更新。秒速干净的新系统设置完成。 这…

如何快速搭建一个ELK环境?

前言 ELK是Elasticsearch、Logstash和Kibana三个开源软件的统称&#xff0c;通常配合使用&#xff0c;并且都先后归于Elastic.co企业名下&#xff0c;故被简称为ELK协议栈。 Elasticsearch是一个实时的分布式搜索和分析引擎&#xff0c;它可以用于全文搜索、结构化搜索以及分…

Linux repo基本用法: 搭建自己的repo仓库[服务端]

概述 Repo的使用离不开Git, Git 和 Repo 都是版本控制工具&#xff0c;但它们在使用场景和功能上有明显区别… Git 定义&#xff1a;Git 是一个分布式的版本控制系统&#xff0c;由 Linus Torvalds 为 Linux 内核开发而设计&#xff0c;现已成为世界上最流行的版本控制软件之…

数据结构与算法 双链表的转置

一、实验内容 有一个带头结点的双链表L&#xff0c;设计一个算法将其所有元素逆置&#xff0c;即第一个元素变为最后一个元素&#xff0c;第2个元素变为倒数第2个元素&#xff0c;最后一个元素变为第1个元素。 二、实验步骤 1、dlinklist.cpp 2、reverse.cpp 三、实验结果 四…

windows 下用使用api OCI_ConnectionCreate连接oracle报错 TNS:无法解析指定的连接标识符

背景&#xff0c;两台服务器系统一样&#xff0c;oracle版本一样&#xff0c;其中一台服务器在运行程序的时候报错 TNS:无法解析指定的连接标识符 但是PL/SQL可以正常连接&#xff0c;怀疑是oracle配置文件的原因 tnsnames.ora配置文件大概作用&#xff1a;是Oracle客户端的网…

如何查看局域网IP?

在日常使用计算机和网络时&#xff0c;我们经常需要查看本地设备在局域网中的IP地址&#xff0c;以便进行一些网络配置或者连接其他设备。本文将介绍如何查看局域网中的IP地址&#xff0c;以及相关技术中的天联组网优势。 查看局域网IP 在Windows操作系统中&#xff0c;我们可…

做Linux驱动开发,怎么去看懂驱动框架?

理解Linux驱动框架是进行Linux驱动开发的关键一步。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。 以下是一些…

100套HTML静态网页模板源码

源码介绍 100套HTML静态网页模板&#xff0c;设计的十分有特色&#xff0c;由于Github服务器原因可能下载速度较慢&#xff0c;已全部打包整理。 源码截图 源码下载 链接&#xff1a;https://pan.baidu.com/s/1dtAeaUUIZJM6ueqA30nQ2g?pwdy5qd 提取码&#xff1a;y5qd

GenICam-GenApi简介

EMVA 1288标准之GemICam-GenApi学习与解读 背景介绍 当前相机不仅用于传输图像&#xff0c;还打包了越来越多的功能。这就导致相机的编程接口越来越复杂。 GenICam的目标是为所有类型的相机提供一个通用的编程接口&#xff0c;无论相机使用何种接口技术&#xff0c;或者实现…

快速编译嵌入式Linux(4.9.229)内核(硬件:mini2440)

目录 概述 1 Linux内核介绍 1.1 Linux 内核版本 1.2 下载Linux 内核 2 编译内核 2.1 解压内核 2.2 编译环境 2.3 编译内核 概述 本文主要以硬件板卡mini2440为例&#xff0c;介绍如何从linux内核官网下载一个原生态的内核源码包&#xff0c;通过简单的配置编译适合在AR…

Python+Django+Yolov5路面墙体桥梁裂缝特征检测识别html网页前后端

程序示例精选 PythonDjangoYolov5路面墙体桥梁裂缝特征检测识别html网页前后端 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjangoYolov5路面墙体桥梁裂缝特征检测识别html网页前…

算法---动态规划练习-7(按摩师)【类似打家劫舍】

按摩师 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 首先&#xff0c;给定一个整数数组 nums&#xff0c;其中 nums[i] 表示第 i 天的预约时间长度。 定义两个辅助数组 f 和 g&#xff0c;长度都为 n&#xff08;n 是数组…

RabbitMQ 实验消费原始队列消息, 拒绝(reject)投递死信交换机过程

如果你想通过 RabbitMQ 的死信队列功能实现消费者拒绝消息投递到死信交换机的行为&#xff0c;你可以按照以下步骤操作&#xff1a; 创建原始队列&#xff0c;并将其绑定到一个交换机上&#xff1a; export RABBITMQ_SERVER127.0.0.1 export RABBITMQ_PORT5672 export RAB…

【VMware Workstation】公司所有主机和虚拟机ip互通,以及虚拟机目录迁移

文章目录 1、场景2、环境3、实战3.1、所有主机和虚拟机ip互通Stage 1 : 【虚拟机】设置为桥接模式Stage 2 : 【虚拟机】设置ipStage 3 : 【路由器】ARP 静态绑定MACStage 3-1 ping 路由器 ipStage 3-2 【静态绑定】虚拟机查看mac地址Stage 3-3 【静态绑定】路由器ARP 静态绑定 …

基于js css的瀑布流demo

要实现照片按照瀑布流展示&#xff0c;写个小demo&#xff0c;记录下。 瀑布流实现思路如下&#xff1a; CSS 弹性布局对 3 列按横向排列&#xff0c;对每一列内部按纵向排列 html代码&#xff1a; <div class"content"></div> css代码&#xff1a; …

【 MyBatis 】| 关于多表联查返回 List 集合只查到一条的 BUG

目录 一. &#x1f981; 写在前面二. &#x1f981; 探索过程2.1 开端 —— 开始写 bug2.2 发展 —— bug 完成2.3 高潮 —— bug探究2.4 结局 —— 效果展示 三. &#x1f981; 写在最后 一. &#x1f981; 写在前面 今天又是 BUG 气满满的一天&#xff0c;一个 xxxMapper.xm…

新手体验OceanBase社区版V4.2:离线部署单节点集群

本文源自OceanBase用户的分享 先简单总结如下&#xff1a; 1.本文适合初学者体验OceanBase社区版 v4.2.2 2.仅需准备一台配置为2C/8G的Linux虚拟机 3.通过离线方式安装&#xff0c;以便更直观地了解安装过程 一、Linux系统准备 在宿主机(即你的windows PC电脑)上安装vbox软…

Mac添加和关闭开机应用

文章目录 mac添加和关闭开机应用添加开机应用删除/查看 mac添加和关闭开机应用 添加开机应用 删除/查看 打开&#xff1a;系统设置–》通用–》登录项–》查看登录时打开列表 选中打开项目&#xff0c;点击“-”符号