在存储结构体实例的vector中构建循环链表时next指针赋值报错
问题解决:用vector存储Node实例构建循环链表
错误原因分析
你写的peoples[0]->next = peoples[1];存在两个核心问题:
peoples[0]是vector中的Node对象实例,并非指针,访问成员变量必须用.而非->(->仅用于指针/智能指针访问成员)。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
相关产品推荐
相关产品推荐

