首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

双向链表C++。在函数后插入不起作用

双向链表(Doubly Linked List)是一种数据结构,它由一系列节点组成,每个节点包含了当前元素的值以及指向前一个节点和后一个节点的指针。

在C++中实现双向链表,可以定义一个双向链表的节点类,该类包含当前节点的值以及指向前一个节点和后一个节点的指针。然后通过对节点的连接来构建链表。

下面是一个简单的示例代码:

代码语言:txt
复制
#include <iostream>

using namespace std;

// 双向链表节点类
class ListNode {
public:
    int val;
    ListNode* prev;
    ListNode* next;

    ListNode(int value) {
        val = value;
        prev = nullptr;
        next = nullptr;
    }
};

// 双向链表类
class DoublyLinkedList {
public:
    ListNode* head;
    ListNode* tail;

    DoublyLinkedList() {
        head = nullptr;
        tail = nullptr;
    }

    // 后插入操作
    void insertAfter(int value, ListNode* prevNode) {
        if (prevNode == nullptr) {
            cout << "Previous node is null." << endl;
            return;
        }

        ListNode* newNode = new ListNode(value);
        newNode->prev = prevNode;
        newNode->next = prevNode->next;
        if (prevNode->next != nullptr) {
            prevNode->next->prev = newNode;
        }
        prevNode->next = newNode;
        if (tail == prevNode) {
            tail = newNode;
        }
    }

    // 打印链表元素
    void printList() {
        ListNode* currentNode = head;
        while (currentNode != nullptr) {
            cout << currentNode->val << " ";
            currentNode = currentNode->next;
        }
        cout << endl;
    }
};

int main() {
    DoublyLinkedList dll;

    // 创建节点
    ListNode* node1 = new ListNode(1);
    ListNode* node2 = new ListNode(2);
    ListNode* node3 = new ListNode(3);

    // 构建链表
    dll.head = node1;
    node1->next = node2;
    node2->prev = node1;
    node2->next = node3;
    node3->prev = node2;
    dll.tail = node3;

    cout << "初始链表:" << endl;
    dll.printList();

    // 后插入节点
    cout << "后插入节点后的链表:" << endl;
    dll.insertAfter(4, node2);
    dll.printList();

    return 0;
}

在上述示例代码中,我们定义了一个ListNode类表示双向链表的节点,包含了当前节点的值以及指向前一个节点和后一个节点的指针。然后定义了一个DoublyLinkedList类表示双向链表,包含了链表的头节点和尾节点,并实现了后插入操作和打印链表元素的方法。

insertAfter函数中,我们首先判断前一个节点是否为空,如果为空则无法进行插入操作。然后创建新节点,并将新节点的指针连接到前一个节点和后一个节点。同时,我们需要更新前一个节点和后一个节点的指针,确保链表的连续性。如果插入节点是尾节点,则需要更新链表的尾节点。

最后,我们在main函数中创建一个双向链表对象,并进行初始化和后插入节点的操作,最后打印链表的元素。

注意:上述代码仅为示例,实际应用中可能需要考虑内存管理和异常处理等其他方面的问题。

腾讯云相关产品和产品介绍链接:

  • 云服务器(CVM):腾讯云提供的弹性计算服务,为用户提供可扩展的云服务器实例。详细介绍请参考:云服务器(CVM)
  • 云数据库 MySQL 版(CMYSQL):腾讯云提供的高性能、高可用的关系型数据库服务。详细介绍请参考:云数据库 MySQL 版(CMYSQL)
  • 腾讯云物联网平台(TIoT):腾讯云提供的一站式物联网开发平台,帮助用户快速实现物联网应用。详细介绍请参考:腾讯云物联网平台(TIoT)
  • 腾讯云人工智能(AI):腾讯云提供的人工智能服务,包括语音识别、图像识别、机器翻译等多种功能。详细介绍请参考:腾讯云人工智能(AI)
  • 腾讯云存储(COS):腾讯云提供的面向对象存储服务,适用于存储和处理任意类型的文件和对象。详细介绍请参考:腾讯云存储(COS)
  • 腾讯云区块链服务(TBC):腾讯云提供的基于区块链技术的安全高效的服务。详细介绍请参考:腾讯云区块链服务(TBC)
  • 腾讯云视频处理(VOD):腾讯云提供的全能型音视频处理服务,满足多种音视频处理需求。详细介绍请参考:腾讯云视频处理(VOD)
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++】STL 容器 - list 双向链表容器 ③ ( list 常用 api 简介 | 中间位置 插入 删除 元素 | insert 函数 | clear 函数 | erase 函数 )

一、list 双向链表容器 的 中间位置 插入 元素 1、指定位置插入 1 个元素 - insert 函数 下面的 std::list#insert 函数原型的作用是 指定的 迭代器位置 position...n 个相同元素 - insert 函数 下面的 std::list#insert 函数原型的作用是 指定的 迭代器位置 position 上 , 插入 n 个 value 值元素 ; void insert...1 it++; // 执行指向索引 2 it++; // 索引 2 位置插入 3 个 666 元素 lstInt.insert(it, 3, 666); // 打印 list 双向链表容器...另一个容器的指定范围内的 元素 - insert 函数 list 双向链表容器 的 中间位置 插入 另一个容器的指定范围内的 元素 ; 下面的函数原型中 , 接受两个迭代器 first 和 last...此外 , 还可以插入 其它类型 容器的元素 , 下面的示例中 , list 双向链表容器 的 2 号索引位置 , 插入了 vector 动态数组 中的所有元素 ; 代码示例 : #include "

23010

C++】STL 容器 - list 双向链表容器 ① ( 容器特点 | 容器操作时间复杂度 | 构造函数 )

文章目录 一、 list 双向链表容器简介 1、容器特点 2、容器操作时间复杂度 3、遍历访问 5、头文件 二、 list 双向链表容器 构造函数 1、默认无参构造函数 2、创建包含 n 个相同元素的...list 双向链表 3、使用初始化列表构造 list 双向链表 4、使用另外一个 list 容器 构造 list 双向链表容器 一、 list 双向链表容器简介 1、容器特点 list 双向链表容器 可以...任意位置 高效的 进行 插入 / 删除 元素 ; list 双向链表容器 的 元素的指针 : 容器 中的元素 , 包含 2 个指针 , 一个指向该元素的前驱 , 一个指向该元素的后继 ; 2、容器操作时间复杂度...list 双向链表容器 操作时间复杂度 : 头部和尾部插入或删除元素的时间复杂度是 O(1) ; 表中间插入或删除元素 , 最坏情况可能需要移动 n 个元素 , 时间复杂度是 O(n) ; 3、遍历访问...尖括号中的 T 泛型类型是 list 双向链表 容器中存储的元素类型 ; lstT 是双向链表容器的 变量名 ; 该默认无参构造函数 会创建空的 list 双向链表 ; 代码示例 : #include

42010

链表的第i个位置插入一个节点(阿里+腾讯等面试题总结)

时间:2014.04.26 地点:基地 ————————————————————————— 一、题目 题目是非常easy和基础,就是链表的第i个位置插入一个节点。要求写代码,5分钟之内完毕。...2.然后再在刚刚得到的指针之后插入新节点 Node* ListLocate(Node* head_ptr,size_t position) { Node* curosr=nullptr; for(size_t...个人比較喜欢固定一种模式,即经常使用的代码编写模式,假设算法实现原理是一样的,仅仅是代码的表现上有所差别,我认为就不是必需花心思耍花样。...链表的实现中比方还可提炼几种编码规范: 1.使用cursor遍历链表指针 for(Node* head_ptr;cursor!...=nullptr;cursor=curosr->get_link()) { ....... } 2.提供两个版本号的编号定位节点的函数或者匹配定位节点的函数 发布者:全栈程序员栈长,转载请注明出处

75230

【数据结构与算法】详解什么是双向链表,并用代码手动实现一个双向链表

从中可以看出,让每个学生记住自己的前桌桌是非常有必要的,因为某些情况下,可以快速地解决问题。 上面讲了那么多,接下来我们就来看一下 双向链表 是什么样的,如图 ?...insert() 双向链表的某个位置插入元素 get() 获取双向链表对应位置的元素 indexOf() 获取某元素双向链表中的索引 update() 修改双向链表中某个位置上的元素的值 removeAt...;属性 tail 表示双向链表中的最后一个元素 (2)创建内部构造函数 双向链表的每一个元素都有三个属性,即prev 、item 和 next,分别表示该元素的前一个元素是谁 、存储着该元素的值和该元素的一个元素是谁...(4)实现insert()方法 insert()方法就是指定的索引位置插入元素。...最后我们再向索引为 3 的位置插入元素 java,因为此时 length = 3,即双向链表元素个数为 3,这就相当于末尾添加元素 dl.insert(3, 'java') 所以此时的链表是这样的

59320

数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现

C语言中,可以通过malloc来分配动态数组,C++使用new。另外,C++的标准模板库提供了动态数组类型vector以及内置有固定数组类型array。 3. 单向链表 单向链表链表的一种。...Node* insert_head(T t); //链表头进行插入 Node* insert_last(T t); //链表尾进行插入...count: 链表元素个数。 3.3 单链表添加节点 链表插入元素操作时间复杂度O(1),只需要进行指针的指向修改操作。 ? 2之后添加7: 为元素7构建节点 。...我们将双向链表实现为双向循环链表,也即是最后一个元素的后继将指向头节点,整个链表形成一个循环 例如,我们为元素1,2,3,4,5 构建一个双向循环链表 ? 图中: 表头为空。.../DoubleLink.h 另外声明: C++模板不支持分离编译,因此类定义与成员函数的实现都在.h文件中完成; 可以看到代码中new一个新节点之后,并没有使用(prt!

1.2K30

C++进阶】深入STL之list:高效双向链表的使用技巧

前言:双向链表链表数据结构的一种重要变体,它允许我们链表的任何位置进行高效的插入和删除操作,而无需像数组那样进行大量的数据移动。...1. list的基本概念 list 是 C++ 标准模板库 (STL) 中的一个容器,它基于双向链表实现。...双向链表是一种动态数据结构,由一系列节点组成,每个节点包含数据元素和两个指向其他节点的指针 介绍list的使用之前,我们先来看看它的结构: 实际上:list就是一个带头双向链表 2. list...因为list的底层结构为带头结点的双向循环链表,因此list中进行插入时是不会导致list的迭代器失效的,只有删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响 void...list以其基于双向链表的特性,为我们提供了序列容器中进行高效插入和删除操作的强大工具。

20910

4.1 C++ STL 动态链表容器

List和SList都是C++ STL中的容器,都是基于双向链表实现的,可以存储可重复元素的特点。...双向链表的数据元素可以通过链表指针串接成逻辑意义上的线性表,不同于采用线性表顺序存储结构的Vector和Deque容器,双向链表中任一位置的元素,查找,插入和删除,都具有高效的常数阶算法时间复杂度O(1...4.1 双向链表遍历整数 这段代码展示了如何通过访问链表节点的指针来遍历链表中的所有元素。 代码中,首先创建了一个空链表MyList。...然后,使用for循环向链表插入10个整数数据,每个数据使用push_back()函数插入链表的末尾。 接着,代码定义了一个双向链表节点指针node,将其初始化为第一个节点的下一个节点。...然后,使用for循环把stu数组中的元素按照顺序插入链表MyList中。插入时,每个结构体通过push_back()函数被加入到链表的末尾。

17810

4.1 C++ STL 动态链表容器

List和SList都是C++ STL中的容器,都是基于双向链表实现的,可以存储可重复元素的特点。...双向链表的数据元素可以通过链表指针串接成逻辑意义上的线性表,不同于采用线性表顺序存储结构的Vector和Deque容器,双向链表中任一位置的元素,查找,插入和删除,都具有高效的常数阶算法时间复杂度O(1...4.1 双向链表遍历整数这段代码展示了如何通过访问链表节点的指针来遍历链表中的所有元素。代码中,首先创建了一个空链表MyList。...然后,使用for循环向链表插入10个整数数据,每个数据使用push_back()函数插入链表的末尾。接着,代码定义了一个双向链表节点指针node,将其初始化为第一个节点的下一个节点。...然后,使用for循环把stu数组中的元素按照顺序插入链表MyList中。插入时,每个结构体通过push_back()函数被加入到链表的末尾。

22810

C++】模拟实现list

kw=list 总结一下: list是可以O(1)范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。...list的底层是带头双向循环链表结构,带头双向循环链表中每个数据元素存储互不相关的独立节点中,节点中通过指针指向其前一个元素和一个元素。...带头双向循环链表结点(Node)需要包含三个成员:前指针域prev,数据域val,指针域next....C++的语法特性,而不会很细致的深入探究链表操作上的结构特性,如果有对链表操作的底层原理和逻辑感兴趣的朋友可以先移步更偏底层逻辑实现的C语言实现双向循环链表的文章: 【数据结构】C语言实现带头双向循环链表万字详解...分析list的组成结构 我们之前C语言阶段就已经一起模拟实现过带头双向循环链表,可以知道C语言中带头双向循环链表的结构是由两部分组成的,一部分是链表结点,一部分是链表本身.因此我们至少要封装两个类模板才能够组成带头双向循环链表

7110

小林手撕 LRU 算法!

如果有新的心跳包,则将其插入双向链表的尾部,那么最老的心跳包就是双向链表的头部,这样寻找宕机的主机时,只要看双向链表头部最老的心跳包,距现在是否超过 5 秒,如果超过 5秒 则认为该主机宕机,然后将其从双向链表中删除...如果不存在哈希表里,说明是新主机上线,先将其插入双向链表的头部,然后将该主机的 IP 作为 Key,主机双向链表的节点作为 Value 插入到哈希表。...如果存在哈希表里,说明主机已经上线过,先通过查询哈希表,找到该主机双向链表里旧的心跳包的节点,然后就可以通过该节点将其从双向链表中删除,最后将新的心跳包插入双向链表的队尾,同时更新哈希表。...今天,就带大家用 C++ 语言手撕 LRU 算法,我们就采用上面讨论的「哈希表 + 双向链表」这两个数据结构来实现该算法。...typedef std::map Map; 知道了数据结构,然后实现两个函数,分别是 put 用于加入数据,get 用户获取数据,

61430

数据结构:双向链表实现队列与循环链表

一、双向链表(double linked list)如图26.5,是链表的每个结点中,再设置一个指向其前驱结点的指针域。...双向链表的基本操作与单链表基本一样,除了插入和删除的时候需要更改两个指针变量,需要注意的是修改的顺序很重要,插入如图3-14-5,删除如图3-14-6。 ? ? ?...要实现双向链表只需《图示单链表插入和删除操作》中代码的基础上改动两个地方。...《队列的链式存储结构》中我们使用单链表实现队列的尾进头出,下面我们演示使用双向链表实现队列的头进尾出。...,这个错误是由于c的编译器要求将变量的定义放在所有函数调用语句之前,而c++没有这样的要求造成的。

1.9K80

线性结构-链表

但在C/C++中,必须要先声明后使用,将节点声明链表前面。定义即可在前也可以在后。 类Node包含两个成员变量: data为整型的变量,是该链表节点的数据域,可以用来存放一个整数。...向链表插入节点 public boolean insertNode(int data, int index) 这个函数表示链表的第index个位置上插入一个整形变量data节点。...删除成功链表的长度减1。 显然,index的取值范围为[1,length]。...所以,要销毁一个链表,只需要将链表的头指针head置为null即可。 如果是C/C++,需要循环调用free()或delete()函数显式地释放内存。...要求合并链表依然按值有序,且不开辟额外的内存空间。 ---- 本体要求不开辟额外的内存空间,也就是要利用原链表的内存空间,不创建新节点的前提下实现链表的合并。

27520

C++】STL容器——list类的使用指南(含代码演示)(13)

前言 大家好吖,欢迎来到 YY 滴C++系列 ,热烈欢迎!...本章主要内容面向接触过C++的老铁 主要内容含: 一、list 类——基本介绍 list是可以常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。...list的底层是双向链表结构,双向链表中每个元素存储互不相关的独立节点中,节点中通过指针指向 其前一个元素和一个元素。...的最后一个节点中值的引用 back list首元素前插入值为val的元素 push_front 删除list中第一个元素 pop_front list尾部插入值为val的元素 pop_back 删除...list中最后一个元素 insert list position 位置中插入值为val的元素 erase 删除list position位置的元素 swap 交换两个list中的元素 clear 清空

19010

【数据结构】链表

之前插入 void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x); pos之后插入 void SListInsertAfter(...带头双向循环链表: 结构最复杂,一般用来单独存储数据,实际中使用到的链表数据结构,都是带头双向循环链表,这个结构虽然复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了....SLTNode* newnode = BuySLTNode(x); prev->next = newnode; newnode->next = pos; } } 12.单链表pos之后插入...:只适合头插头删——O(1) 任意位置高效插入删除——双向链表 进阶:删除pos位置 要求是O(1) 替换法删除 缺陷:pos不能是尾结点 解决方法:将链表改成循环链表 进阶:pos位置之前插入 要求是...O(1) 方法:pos位置创造结点+替换法 newnode = BuySListNode(pos->val); pos->val = x;

29820

【STL】list的使用

放在专栏【C++知识总结】,会持续更新,期待支持 1、list简介 list是可以常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。...list的底层是带头双向链表结构,双向链表中每个元素存储互不相关的独立节点中,节点中通过指针指向 其前一个元素和一个元素。...规范之“前闭开”。...这里list由于不像vector那样,vector的插入操作可能会引起扩容,从而导致迭代器失效,而list则不会,因为list的底层结构为带头结点的双向循环链表,因此list中进行插入时是不会导致list...《点击跳转》 3.5.1、reverse reverse函数用于实现链表的逆置,如下: 3.5.2、swap 很熟悉了,用于两个链表实现数据交换。

22830

Windows 驱动开发 - 链表的数据结构

主要分为单向链表双向链表。 单向链表链表节点只有一个链表节点指针。 双向则是两个。 分别是指向前链表节点和链表节点。 双向链表指向了前后两个节点。...所以链表插入移除上面的操作比单向链表更为方便。...因为我是堆栈中使用的,所以你的链表存储的数据都是基于堆栈的。 所以出了函数就没法使用了。 看一个错误的例子,我把链表定义为了全局。...首先我们使用了use_headinfo 将节点插入,这个没问题。 出问题的是我们DriverEntry里面 遍历链表,并且取出值来将其修改。..., 参数分别是给定头尾节点进行删除,删除返回删除的节点,如果没有则返回NULL 删除特定节点的参数则是给定一个节点然后删除,如果删除链表变成了空链表则是返回true否则就是FALSE 1.7 链表操作

1.2K20

「数据结构与算法Javascript描述」链表

JavaScript 中数组的主要问题是,它们被实现成了对象,与其他语言(比如 C++ 和 Java)的数组相比,效率很低。 如果你发现数组实际使用时很慢,就可以考虑使用链表来替代它。...下图 演示了如何在 eggs 加入 cookies: image-20220125203143740 从链表中删除一个元素也很简单。...该类的功能包括「插入删除节点」、「列表中查找给 定的值」。...3.3 插入新的节点 我们要分析的第一个方法是 insert,该方法向链表插入一个节点。向链表插入新节点时,需要明确指出要在哪个节点前面或后面插入。首先介绍如何在一个已知节点后面插入元素。...一个已知节点后面插入元素时,先要找到“后面”的节点。为此,创建一个辅助方法find(),该方法遍历链表,查找给定数据。如果找到数据,该方法就返回保存该数据的节点。

84320

数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解

由于不必须按照顺序存储,链表插入的时候可以达到o(1)的复杂读,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn...链表有很多种不同的类型:单向链表双向链表以及循环链表链表可以多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。...程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。 啥是单向链表双向链表及循环链表?...双向链表 双向链表和单向链表的差别不是很大,只是比单向链表多了一个指向直接前驱节点的指针,这样使得,可以从双向链表的任一一个节点开始,都可以方便的访问它的前驱节点和后继节点 ?...public void clear() { size=0; first=null; } 将fist设置为null即可,因为当fist与节点断开连接

61620

C++ 顺序容器基础知识总结

C++11中,list新增了三个接口,以支持指定位置构造对象插入容器中: 接口(C++11新增) 描述 emplace 指定位置之前插入新构造的元素 emplace_front 链表插入新构造的元素...emplace_back 链表插入新构造的元素 4.3.内存分配策略 list的空间配置策略,自然是像我们普通双向链表那样,有多少元素申请多少内存。...所谓的双向开口,意思是可以头尾两端分别做元素的插入和删除操作。...vector 可动态增长的数组 支持快速随机访问 尾部可高效插入/删除元素 若插入操作引起内存重新分配,则全部迭代器失效;否则插入点/删除点之后的迭代器失效; list 双向链表 只支持元素的双向顺序访问...单向链表 只支持元素的单向顺序访问 链表的任何位置可高效插入/删除元素 插入操作指向容器的迭代器有效;删除操作指向其他位置的迭代器有效 string 只存储字符元素的动态数组 支持快速随机访问 尾部可高效插入

1.3K50
领券