单链表删除所有值为x的元素_线性表之单链表

 单链表

一种以链接方式存储的线性表,适用于频繁增删操作,存储空间不定的情形。

单链表的一个存储结点包含两个域,数据域和指针域。数据域用于存储线性表的一个数据元素,指针域用于指示下一个结点开始的存储地址。

b51a6a8a592f7d0b3237826f81342528.png

链表第一个结点的地址可通过头指针找到,其他结点的地址则在前驱结点的指针域中,最后一个结点没有后继,用NULL终结。

cc697b8cc175d4d2473d1725b16783fe.png

为了操作的方便,习惯上单链表带一个头结点,也就是first指向的第一个结点不存放任何数据,从第二个结点开始存放数据。

881f993194f6a4599bc66db8bf99665f.png

由于指针域的存在,数据元素的顺序与物理存储顺序可能不一致。

e8eadd10c8133f775ad26c1e3489d2da.png

定义与封装

//结点的定义
struct LinkNode {        //链表结点类的定义int data;           //数据域
    LinkNode *link;     //链指针域

    LinkNode() { link = NULL; }     //构造函数
    LinkNode(int item, LinkNode *ptr = NULL)
    { data = item;  link = ptr; }     //构造函数
};
//链表操作封装
class List{protected:LinkNode *first;     //表头指针,头结点public:
    List() { first = new LinkNode; }  //构造函数
    List(int x) { first = new LinkNode(x); }
    ~List(){ }                  //析构函数void inputFront (int val);LinkNode *Search(int x);    //搜索含x元素LinkNode *Locate(int i);    //返回第i个元素地址bool Insert (int i, int x); //在第i元素后插入bool Remove(int i, int& x); //删除第i个元素bool IsEmpty() const         //判表空否{ return first->link == NULL ? true : false; }void show();
};

带附加头结点的插入操作

1、newnode->link = p->link; 

2、p->link = newnode;

c81239242ffbbb40fd5570b547ba6011.png

注意图中标1和2的位置与代码相结合

//将新元素 x 插入在链表中第 i 个结点之后。
bool List::Insert (int i, int x) {
    LinkNode *current = Locate(i);if (current == NULL) return false;   //无插入位置 LinkNode *newNode = new LinkNode(x); //创建新结点    //图中标识的1处,在不破坏原链表的情况下让新结点先链入
    newNode->link = current->link;       //链入    //图中标识的2处,接到新结点
    current->link = newNode;  
          return true;                
}

带附加头结点的查找操作

查找过程就是从第一个结点开始不断沿着link域寻到和所需值相同的结点

//在表中搜索含数据x的结点, 搜索成功时函数返//该结点地址; 否则返回NULL。
LinkNode *List::Search(int x) {
     LinkNode *current = first->link;while( current != NULL && current->data != x )      
        current = current->link;    //沿着链找含有x的结点
return current;
}

带附加头结点的删除操作

1、q = p->link;

2、p->link = q->link;

3、delete q; 

7ea861224de9bb6c887fb1ec680e1eae.png

//删除链表第i个元素, 通过引用参数x返回元素值
bool List::Remove (int i, int& x ) {//图中指针p
    LinkNode *c
urrent = Locate(i-1);if(current == NULL || current->link == NULL)   return false;     //删除不成功      //图中指针q
    LinkNode *del = current->link; 
    //图中操作2,p的link指向指针q的link指向的域,越过q
    current->link = del->link;

    x = del->data;    //脱节的q可以直接删除   delete del; return true;
}

附加头结点的单链表创建

一般单链表的创建可采用前插法或者尾插法,

前插法就是每来一个新的结点,就把这个结点插在头结点的后面。

尾插法就是每来一个新的结点就把这个结点插在链表最后一个结点的后面,相比前插法需要设置一个尾指针。

实现插入过程和链表的插入操作几乎无区别。

void List::inputFront (int val) {
    LinkNode *newNode = new LinkNode;if(newNode==NULL) return;
    newNode = new LinkNode(val);newNode->link = first->link;      //插在表前端
    first->link = newNode;

}

优点:

长度很容易方便扩充。

缺点:

存储空间上多了指针域,存储空间代价比顺序表大。

至于带附加头节点和不带附加头节点的好处,看过书的同学都知道,前者的增删操作更简练

代码https://github.com/xiaoYaChh/datastructure.git

参考资料:数据结构第二版,殷人昆,清华大学出版社

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

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

相关文章

PHP自动测试框架Top 10

2019独角兽企业重金招聘Python工程师标准>>> 对于很多PHP开发新手来说,测试自己编写的代码是一个非常棘手的问题。如果出现问题,他们将不知道下一步该怎么做。花费很长的时间调试PHP代码是一个非常不明智的选择,最好的方法就是在编…

树莓派 设备信息 php,树莓派实现DDNS(PHP计划任务)

之前介绍了DNSPod动态IP解析更新程序,是Python实现的。下面介绍一个PHP实现的脚本,实现了同样的动态域名解析功能。header("Content-type: text/html; charsetutf8");class Dns{#Dnspod账户private $dnspod_user userexample.com;#Dnspod密码…

某公司数据恢复报告书

一、故障描述1、设备清单设备名称设备型号数量HP FC存储HP MSA20001450G SAS.硬盘82、故障描述整个存储空间由8块450GB SAS的硬盘组成,其中7块硬盘组成一个RAID5的阵列,剩余1块做成热备盘使用。由于RAID5阵列中出现2块硬盘损坏,而此时只有一块…

python写sql语句_简单的(笨的)用python以及SQL语句书写增删改查

班级列表ID 班级名称 删除 修改{% for row in class_list %}{{ row.id }} {{ row.title }} {# 删除数据库#}--- {# 修改数据库#}*** {% endfor %}

如何返回一个只读泛型集合

Private md_states As New List(Of String)Private md_states As New List(Of String) ReadOnly Property States() As System.Collections.ObjectModel.ReadOnlyCollection(Of String) Get Return Me.md_states.AsReadOnly End Get End Property 转载于:https://www.cnblogs.c…

2013年计划

想写一本书,给非计算机专业人士看的关于计算机作用原理的书:比如键盘敲打,为啥会在显示屏中显示,这个敲打过程,计算机到底在里面做了啥,为啥屏幕刚好显示的就是输入法中显示的一模一样,为啥计算…

php .htaccess 的作用,php .htaccess文件使用详解

1、.htaccess文件使用前提.htaccess的主要作用就是实现url改写,也就是当浏览器通过url访问到服务器某个文件夹时,作为主人,我们可以来接待这个url,具体地怎样接待它,就是此文件的作用。所有的访问都是通过URL实现&…

java里的时间转换

2019独角兽企业重金招聘Python工程师标准>>> http://cwind.iteye.com/blog/1908589 http://dyccsxg.iteye.com/blog/1908607 转载于:https://my.oschina.net/mustang/blog/608365

command对象提供的3个execute方法是_并发面试题:java中有几种方法可以实现一个线程?...

创建并启动线程的6种方式 继承Thread类创建线程实现Runnable接口创建线程使用Callable和FutureTask创建线程使用线程池,例如用Executor框架Spring实现多线程(底层是线程池)定时器Timer (底层封装了一个TimerThread对象&#xff09…

入侵思路新手学习内容

1.入侵主机的思路 第一.先找定目标<网站或IP> 没有目标怎样入侵? 第二.找到目标是什么操作系统! 操作系统都不知道找漏洞,又怎样成入侵成功! 第三,找操作系统漏洞!如开放的端口,开放的服务等!!! 没找到漏洞怎样入侵? 第四.扫描端口!找有没有漏洞利用的端口! 端口就是…

matlab中如何提取等高线,在Python或MATLAB中从等高线图中提取数据

这是一个小型的Matlab脚本&#xff0c;可以完成这项工作(使用一些GUI&#xff0c;在图的斜角处读取guidlines)&#xff1a;%// Import the data:imdata importdata(your_picture_file);Gray rgb2gray(imdata.cdata);colorLim [-1 1]; %// this should be set manually%// Ge…

【Android Studio】分类整理res/Layouts中的布局文件(创建子目录)

好吧&#xff0c;这个功能需求也是因为作为一个重度强迫症患者&#xff0c;非常想要把layouts中的文件分类整理下。否则看到一堆Activity和Fragment等文件混在一起特别难受。更重要的原因是&#xff0c;如果你的工程交给别人维护&#xff0c;别人看到一堆布局文件压根不知道从哪…

从零开始学python项目_从零开始可以这样学python

从零开始学python第二章 面向对象第一篇 太原理工大学机器人团队20日打卡day9 ​ 当我们讨论python时不得不讨论到面向对象&#xff0c;而我身为机器人团队的一名成员&#xff0c;在平时设计的时候可以通过把机器人的各个部分设计成不同的对象以此来简化重复的函数引用。并且py…

GDI绘图基本步骤总结(经典)

一、获得绘图的窗口句柄 方法(详细参数及其调用可以看考MSDN)&#xff1a; 1、 HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName) HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName) 2、 HWN…

SQL排序查询

1.建一张客户表&#xff0c;包含客户名称&#xff0c;联系人&#xff0c;电话号码&#xff0c;公司地址. 2.建一张订单表&#xff0c;包含订单编号&#xff0c;客户ID,供应商ID,订单金额&#xff0c;客户支付状态&#xff0c;供应商支付状态,订单日期. 3.建一张供应商表&#x…

php smarty框架案例,php封装的smarty类案例

这篇文章主要介绍了php封装的smarty类,针对Smarty的基本操作技巧进行了封装整理,具有一定参考借鉴价值,需要的朋友可以参考下具体如下&#xff1a;/*** Project: Smarty: the PHP compiling template engine* File: Smarty.class.php* SVN: $Id: Smarty.class.php 4848 2014-06…

使用pip安装BeautifulSoup4模块

1.测试是否安装了BeautifulSoup4模块 import bs4 print bs4 执行报错说明没有安装该模块 Traceback (most recent call last):File "D:\work_java\python\src\baike_spider\test.py", line 7, in <module>import bs4 ImportError: No module named bs4 2.使用p…

mysql8创建用户并授权_新特性解读 | 从 wireshark 看 MySQL 8.0 加密连接

作者&#xff1a;秦福朗爱可生 DBA 团队成员&#xff0c;负责项目日常问题处理及公司平台问题排查。热爱 IT&#xff0c;喜欢在互联网里畅游&#xff0c;擅长摄影、厨艺&#xff0c;不会厨艺的 DBA 不是好司机&#xff0c;didi~本文来源&#xff1a;原创投稿*爱可生开源社区出品…

ACM进阶

ACM队不是为了一场比赛而存在的&#xff0c;为的是队员的整体提高。大学期间&#xff0c;ACM队队员必须要学好的课程有&#xff1a;l C/C两种语言l 高等数学l 线性代数l 数据结构l 离散数学l 数据库原理l 操作系统原理l 计算机组成原理l 人工智能l 编译原理l 算法设计与分析除此…

[转 TDD] 如何坚持TDD:使用者出现的问题以及解决方案

原文地址&#xff1a;http://www.infoq.com/cn/articles/levison-TDD-adoption-strategy 转载于:https://www.cnblogs.com/cly84920/archive/2010/03/24/4426820.html