如何用C++的向量实现链表,以及链表的插入删除功能

(1)找到位置p(ai-1

(2)生成新结點s数据域赋值

(3)新结点指针域指向ai(ai的地址存放在ai-1的指针域

(4)ai-1的指针域指向新结点s

(1)找到要删除的结点前一个结点p(原因是删除结点的位置在前一个结点的指针域)

(2)把p->next指向ai的下一个结点(把ai从链上摘除)

ListNode* p,*r; //声明两个指针一个用来找到删除结点前的结点。 一個用来存储要删除结点的后继结点的地址的 r=p->next; //把删除结点的首地址给临时结点 这样就能把删除结点的指针域保存下来

删除结点必须保证在連边长度内。即1<=i<=n;

两步:(1)保存头元素的指针域(即头元素的后继节点的首地址)

(2)头结点指针域指向头元素的后继节点

}
    Note:插入和删除一个元素只需要修改该位置上前后节点的指针即可。
  1. 不需要一个连续的很大的内存
    Note:链表内存为随机分配,基本不存在链表满的情况
    查找某个未知的元素效率低
    Note:需要从头结点或者尾结点(双向链表)开始,对每个节点进行遍历直到找到该元素。
  1. 需要一个很连续的很大的内存
    例:若某个程序需要10W个字节作为存储空间,可能内存中找不到连续的、空闲的10W个字节内存此时会出现内存分配失败
  2. 插入和删除元素的效率很低。
    例:每插入和删除一个元素该操作位置之后的所有元素都要往前(删除)或往后(插入)移动一个位置。
  1. 首节点:存放第一个有效數据的节点
  2. 头结点:头结点的数据类型和首节点的类型是一模一样的头结点并不存放有效数据。设计头结点的目的是为了方便对链表的操作
  3. 尾结点:存放最后一个有效数据的节点。
  4. 头指针: 存放头结点地址的指针变量

如图单向链表的每个节点分为两个域,一个是数据域一个是指针域,指针域存放的指针指向下一个节点

此处使用一个数组来创建单链表。
单链表的创建分为头插法和尾插法
头插法:烸次元素插入到头结点和第一个节点之间
尾插法:每个元素插入到链表最后一个节点之后

如图,要在图示P1和P2之间插入节点只需将P1指向P2的指针销毁,令P1重新指向P3P3指向P2。
由此可知要在第n个节点(假设第n个节点为有效节点)上插入一个元素,大致可分为4个步骤:

  1. 新建一个节點用于存放待插入的元素
  2. 第n-1个节点指向新节点

如图,若要删除P2节点只需令P1指向P2的后驱节点(即P2后一个节点),再销毁掉为P2分配的空间即可
删除第n个节点(假设该节点为有效节点)大致分为:

  1. 使用零时指针p指向第n个节点
  2. 令第n-1个节点指向第n+1个节点
  3. 销毁p指向的节点(即第n个节點)

从头结点开始遍历每个节点,并显示该节点的值

链表是数据结构中比较重要的知识点在学习的时候建议多动笔,在草稿纸上模拟電脑逐步运行的过程
笔者也是初学者,如果有什么问题欢迎留言交流,大家共同进步

}

本篇文章主要接着上文的

插入新節点同样分为三种情况分别进行操作:
1.当删除链表头的节点时,把头指针指向第二个节点即可并释放第一个节点内存空间。
2.当删除中間节点时将要删除节点的前一个节点的右指针指向要被删除节点的后一个节点,再将删除节点的后一个节点的左指针指向被删除节点的湔一个节点并释放内存空间。
3.当删除尾结点时把指向最后一个节点之前的一个节点的右指针直接指向NULL,并释放内存空间即可


包括双姠链表的创建、遍历、插入、删除。

cout<<"请输入预插入位置之前的元素和要插入的元素(例:5 8): ";

对上面代码中出现的函数做简单讲解:
FindNode()方法通過头结点和要查询的数据遍历链表并返回预查询数据的节点;
CreateList()通过用户输入的数组创建一个链表;
PrintList()通过传入的链表头指针遍历整个链表數据并输出(双向链表分为两个方向进行)。

本文完成的代码只作为双向链表创建、遍历、插入、删除的简单实例分别插入、删除了一佽,读者也可自行添加判断语句通过输入来控制是插入还是删除且本文代码所设前提为链表内数据唯一,即没有两个相同的数据如果栲虑数据不唯一,则增加了难度不便于初学者理解链表的插入、删除节点。同时没有考虑其他更多的意外情况,例如:用户输入要删除的元素实际链表中不存在;这些操作需要在具体使用时再根据调整。

作者水平有限旨在记录自己的学习过程,大家发现有什么错误戓者建议尽可提出

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信