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

C++链表无法正常输出求助:动态机器人列表存储与显示异常

问题排查与代码修正

核心问题分析

你的代码存在多个关键逻辑错误,导致链表无法正确存储数据,display函数输出异常:

  1. 节点赋值顺序错误:在addNode中,先创建newNode并将空的botName赋值给name_,之后才读取用户输入,导致节点名称始终为空。
  2. 链表尾部添加逻辑错误:链表非空时,没有将已创建的newNode挂到尾部,而是新建了空节点,造成内存泄漏且添加无效节点。
  3. 未调用display函数:main函数中没有执行display(),无法查看存储结果。
  4. 析构函数未实现:空析构函数会导致链表节点内存无法释放,引发内存泄漏。
  5. NULL与nullptr混用:C++中建议统一使用nullptr,避免类型匹配问题。

修正后的完整代码

#include <iostream>
#include <string>

class Node{
public:
    std::string name_;
    Node* next;
    // 新增构造函数,安全初始化节点
    Node(const std::string& name) : name_(name), next(nullptr) {}
};

class linkedBotList{
public:
    // 用初始化列表规范构造函数
    linkedBotList() : head(nullptr) {} 
    // 实现析构函数,释放所有节点内存
    ~linkedBotList(){
        Node* temp;
        while(head != nullptr){
            temp = head;
            head = head->next;
            delete temp;
        }
    }
    
    void addNode(const std::string& botName);
    void display();

private:
    Node* head;   
};

int main(int argc, const char * argv[]) {
    // 优先使用栈对象,避免不必要的动态分配
    linkedBotList list; 
    int siz;
    
    std::cout << "How many Robots?" << std::endl;
    std::cin >> siz;
    std::cin.ignore(); // 忽略输入数字后的换行符,避免影响后续名称输入
    
    std::cout << "What are the names?" << std::endl;
    for(int i = 0; i < siz; i++){
        std::string botName;
        std::cin >> botName;
        list.addNode(botName);
    }
    
    list.display(); // 调用display输出链表内容
    return 0;
}

void linkedBotList::addNode(const std::string& botName){
    Node* newNode = new Node(botName); // 用构造函数直接初始化节点
    
    if(head == nullptr){
        head = newNode;
    }
    else {
        Node* temp = head;
        while(temp->next != nullptr){
            temp = temp->next;
        }
        temp->next = newNode; // 将新建节点挂到链表尾部
    }
}

void linkedBotList::display() {
    if (head == nullptr) {
        std::cout << "List is empty!" << std::endl;
    }
    else {
        Node* temp = head;
        while (temp != nullptr) {
            std::cout << temp->name_ << " ";
            temp = temp->next;
        }
        std::cout << std::endl;
    }
}

新手编程建议

  • 优先使用栈对象:除非必须,不要用new动态分配对象,栈对象会自动销毁,降低内存泄漏风险。
  • 用构造函数初始化成员:给类添加构造函数,避免成员变量处于未初始化状态,提升代码安全性。
  • 及时实现析构函数:包含动态内存的类必须写析构函数释放资源,避免内存泄漏。
  • 分步调试验证:调试时可在关键步骤(如添加节点后)打印节点信息,逐步验证逻辑正确性。
  • 统一代码风格:空值统一用nullptr,变量命名保持一致,提升代码可读性。

内容的提问来源于stack exchange,提问作者Noah M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:25:20