单链表

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

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

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

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

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

定义与封装

//结点的定义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;

注意图中标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;

//删除链表第i个元素, 通过引用参数x返回元素值bool List::Remove (int i, int& x ) {//图中指针p    LinkNode *current = 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

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

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

  1. 单链表删除所有值为x的元素_双链表的基本实现与讲解(C++描述)

    双链表 双链表的意义 单链表相对于顺序表,确实在某些场景下解决了一些重要的问题,例如在需要插入或者删除大量元素的时候,它并不需要像顺序表一样移动很多元素,只需要修改指针的指向就可以了,其时间复杂度为 ...

  2. 递归删除单链表中所有值为x的元素_如何纯递归反转链表的一部分

    读完本文,你可以去力扣拿下如下题目: 92.反转链表II ----------- 反转单链表的迭代实现不是一个困难的事情,但是递归实现就有点难度了,如果再加一点难度,让你仅仅反转单链表中的一部分,你是 ...

  3. 单链表删除所有值为x的元素_C/C++编程笔记:如何使用C++实现单链表?单链表的基本定义...

    如何弥补顺序表的不足之处? 第一次学习线性表一定会马上接触到一种叫做顺序表(顺序存储结构),经过上一篇的分析顺序表的优缺点是很显然的,它虽然能够很快的访问读取元素,但是在解决如插入和删除等操作的时候, ...

  4. echart data放入数组_线性表(数组、链表、队列、栈)详细总结

    线性表是一种十分基础且重要的数据结构,它主要包括以下内容: 数组 链表 队列 栈 接下来,我将对这四种数据结构做一个详细的总结,其中对链表实现了十几种常见的操作.希望对你有所帮助. 1.数组 数组(A ...

  5. java中线性表删除元素和删除指定元素_线性表的插入和删除(Java版)

    1.线性表的定义: (1).线性表是一种可以在任意位置插入和删除数据元素操作.由n(n≥0)个相同类型数据元素a0, a1,-, an-1组成的线性结构.除了第一个元素没有前驱元素和最后一个元素没有后 ...

  6. python线性链表_线性表 (单链表、循环链表-python实现)

    #定义每个节点 classNode:def __init__(self,data): self.data=data self.next=NoneclasslinkList:#初始化头结点 def __ ...

  7. 数据结构实验二——建立具有至少10个元素的顺序表或单链表,并能对该表进行查找、删除等基本操作。

    结合实际应用,建立具有至少10个元素的顺序表或单链表,并能对该表进行查找.删除等基本操作. //主函数 #include"Sq.h" #include<stdio.h> ...

  8. 需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是 。 A 单链表 B 静态链表 C 线性链表 D 顺序存储结构

    1.需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是 . A 单链表 B 静态链表 C 线性链表 D 顺序存储结构 答案:B 2.静态链表中指针表示的是() A 内存地址 B下一元素地 ...

  9. 线性表11|单链表小结:腾讯面试题 - 数据结构和算法16

    线性表11|单链表小结:腾讯面试题 让编程改变世界 Change the world by program 静态链表的删除操作 我们的故事还没结束,小C看到小A和2B这样非法的勾当,内心觉得很不爽,一 ...

最新文章

  1. 探讨SQL Server 2005.NET CLR编程
  2. 一个 Java 对象到底有多大?
  3. Linux常用命令笔记一
  4. MySQL用户管理、常用SQL语句、MySQL数据库备份恢复
  5. 计算机无法显示移动硬盘,移动硬盘在我的电脑中不显示了 怎么处理?
  6. 设计模式-单件模式(Singleton pattern)
  7. Linux(三) 运行级别
  8. string.h包含哪些函数_多个函数组合拳专治不规则时间转化难题|Excel134
  9. 07.敏捷项目管理——推测阶段笔记
  10. 关于JWT(Json Web Token)的思考及使用心得
  11. phalapi 数据库锁_[7.11]-phalapi-进阶篇5(数据库读写分离) | PhalApi(π框架) - PHP轻量级开源接口框架...
  12. python pip安装
  13. 3500常用汉字书法体检测数据集
  14. vscode安装及插件安装
  15. Processing编写熊猫
  16. 运行tomcat 时报错,提示无法找到相关的jar包 Publishing failed with multiple errors Error reading file
  17. Python编程:从入门到实践(基础知识)
  18. Linux摄像头UVC驱动第五篇--启动传输之设置摄像头参数
  19. Android中实现截图的几种方式
  20. python提取wind数据_用Python从wind获取数据,转换成dataframe格式,并保存为Excel文件,excel...

热门文章

  1. [TJOI2010]阅读理解
  2. hdu 6168 Numbers
  3. koa中间件机制详解
  4. Java 概述和编程基础
  5. jquery ui动态切换主题的一种实现方式
  6. Eclipse3.6.2 64位启动报“Failed to load the JNI shared library”错的解决方法
  7. MUI H5+ 开发app基础
  8. MySql修改数据库编码为UTF8
  9. PHP 销毁指定目录
  10. 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解