首页
学习
活动
专区
工具
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)
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【数据结构】双向链表

顺序表的优点: 1.尾插尾删的效率很高 2.可以用下标随机访问 3.相比链表结构 CPU高速缓存命中率更高 顺序表的缺点: 1.头部和中部插入效率低——O(N) 2.扩容时的性能消耗+扩容时的空间浪费 链表的优点: 1.任意位置插入删除效率很高——O(1) 2.按需申请释放 链表的缺点: 1.不支持随机访问 注:三级缓存被称为CPU周围的禁卫军 CPU执行指令不会直接访问内存  1.先看数据在不在三级缓存,在(命中),直接访问 2.不在(不命中),先加载到缓存,再访问 注:加载到缓存时,会将需要加载的位置开始的一段都加载进缓存,(加载多少取决于硬件) 由于顺序表的数据彼此之间的地址紧密联系 所以加载到高速缓存时命中率高 但链表不然 更可能会导致缓存污染

03
  • 详解双向链表的基本操作(C语言)

    上一节学习了单向链表单链表详解。今天学习双链表。学习之前先对单向链表和双向链表做个回顾。 单向链表特点:   1.我们可以轻松的到达下一个节点, 但是回到前一个节点是很难的.   2.只能从头遍历到尾或者从尾遍历到头(一般从头到尾) 双向链表特点   1.每次在插入或删除某个节点时, 需要处理四个节点的引用, 而不是两个. 实现起来要困难一些   2.相对于单向链表, 必然占用内存空间更大一些.   3.既可以从头遍历到尾, 又可以从尾遍历到头 双向链表的定义:   双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。下图为双向链表的结构图。

    03

    算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)

    温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结。数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下。当然数据结构相关博客中我们以Swift语言来实现。因为Swift语言是面向对象语言,所以在相关示例实现的时候与之前在大学学数据结构时C语言的实现有些出入,不过数据结构还是要注重思想,至于实现语言是面向对象的还是面向过程的影响不大。 接触过数据结构的小伙伴应该都知道程序 = 数据结构 + 算法。数据结构乃组织组织数据的结构,算法就是对这些结构中的数据进行操作,可见数据结构的重

    07
    领券