You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在存储结构体实例的vector中构建循环链表时next指针赋值报错

问题解决:用vector存储Node实例构建循环链表

错误原因分析

你写的peoples[0]->next = peoples[1];存在两个核心问题:

  1. peoples[0]是vector中的Node对象实例,并非指针,访问成员变量必须用.而非->(->仅用于指针/智能指针访问成员)。
  2. next是Node*类型的指针,需要赋值的是对象的内存地址,而非对象本身,因此要使用&peoples[1]来获取第二个Node的地址。

修正后的完整代码

#include <iostream>
#include <vector>
using namespace std;

// 循环链表节点结构体
struct Node {
    int data;
    Node* next;

    Node(int value) : data(value), next(nullptr) {}
};

int main()
{
    vector<Node> peoples;

    // 动态添加节点(数量可根据运行时需求调整)
    peoples.emplace_back(1);
    peoples.emplace_back(2);
    peoples.emplace_back(3);

    // 构建循环链表
    int nodeCount = peoples.size();
    for (int i = 0; i < nodeCount; ++i) {
        // 当前节点的next指向下一个节点,最后一个节点指向第一个节点
        peoples[i].next = &peoples[(i + 1) % nodeCount];
    }

    // 测试循环链表:遍历输出所有节点值
    Node* current = &peoples[0];
    do {
        cout << current->data << " ";
        current = current->next;
    } while (current != &peoples[0]);

    return 0;
}

关键注意事项

  • 用peoples[i].next访问对象的成员指针,因为peoples[i]是实例而非指针。
  • 赋值时通过&取地址符获取节点的内存地址,模运算% nodeCount确保最后一个节点的next指向第一个节点,形成闭环。
  • 若后续需要对vector执行push_back、insert等可能触发内存重分配的操作,之前保存的Node指针会失效(vector会将元素迁移到新内存地址)。如果需要动态增减节点,建议改用vector<unique_ptr<Node>>或vector<Node*>存储指针,避免地址失效问题。

内容的提问来源于stack exchange,提问作者Vladislav Butko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:53:10