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

C++链表(Node/Linked List)运行结果异常求助

嘿,我来帮你捋捋代码里的问题——这些正是导致你遇到随机崩溃、无限循环的根源:

核心问题分析与修复

1. append函数:错误释放刚加入链表的节点

你在append里创建了新节点temp,把它接入链表后立刻执行delete temp,这会让链表指向一块已经被系统回收的内存(也就是悬空指针)。后续访问这些节点时,内存可能已经被重新分配给其他数据,自然会出现随机崩溃、行为异常的情况。

修复后的append函数:

void append(Node*& head, int val) {
    Node* temp = new Node;
    temp->data = val;
    temp->next = nullptr;

    if (head == nullptr) { 
        head = temp;
    } else {
        Node* ptr = head;
        while (ptr->next != nullptr) { 
            ptr = ptr->next;
        }
        ptr->next = temp;
    }
    // 绝对不能delete temp!它现在是链表的一部分了
}

2. printList函数:空指针访问+遍历逻辑错误

  • 如果链表为空(head是nullptr),你直接访问n->data会触发崩溃;
  • 原有的遍历逻辑先打印第一个节点,再循环打印下一个节点的data,不仅冗余,还可能在链表节点被错误修改时触发无限循环。正确的遍历应该从head开始,只要节点不为空就打印。

修复后的printList函数:

void printList(Node* head) {
    Node* n = head;
    while (n != nullptr) { // 遍历所有非空节点,安全且完整
        cout << n->data << endl;
        n = n->next;
    }
}

3. insertNode函数:多处内存操作错误

  • 不需要new Node来创建prevLoc,直接用指针指向链表中的现有节点即可。原代码里new出来的prevLoc是一个孤立的空节点,访问它的next会导致未定义行为;
  • 插入完成后delete temp和delete prevLoc会把刚插入的节点和临时指针释放,直接破坏链表结构;
  • 没有处理插入到链表头部(loc=0)的情况,此时没有前驱节点,需要直接把head指向新节点。

修复后的insertNode函数:

void insertNode(Node*& head, int val, int loc) {
    Node* temp = new Node;
    temp->data = val;
    temp->next = nullptr;

    if (loc == 0) { // 单独处理插入头部的情况
        temp->next = head;
        head = temp;
        return;
    }

    Node* prevLoc = head;
    Node* curr = head->next;
    int tempPos = 1;

    while (curr != nullptr && tempPos != loc) {
        prevLoc = curr;
        curr = curr->next;
        tempPos++;
    }

    prevLoc->next = temp;
    temp->next = curr;
    // 不要delete任何和链表关联的指针!
}

4. searchList函数:错误释放链表节点(额外提醒)

你在searchList里执行delete curr会直接删除链表中的节点,破坏整个链表结构。另外原搜索逻辑也存在遗漏最后一个节点的问题,不过你说可以忽略这部分,这里只提关键错误:不要随便delete链表中的节点,除非你明确要移除它。

基础修复后的searchList(保留你的逻辑框架):

void searchList(Node* head, int sVal, int iCount) {
    Node* curr = head;
    int index = 0;
    bool found = false;

    while (curr != nullptr) {
        if (curr->data == sVal) {
            cout << "Number found at index " << index << " in the linked list!" << endl;
            found = true;
            break;
        }
        curr = curr->next;
        index++;
    }

    if (!found) {
        cout << "Number could not be found in this linked list." << endl;
    }
    // 绝对不能delete curr!
}

额外优化:解决内存泄漏

上面的修复解决了崩溃问题,但你的代码目前没有释放链表的内存,程序结束后会导致内存泄漏。可以添加一个函数来手动释放所有节点:

void deleteList(Node*& head) {
    Node* temp;
    while (head != nullptr) {
        temp = head;
        head = head->next;
        delete temp;
    }
}

然后在main函数末尾调用deleteList(head);即可。


把这些修复后的代码替换到你的程序里,应该就能解决随机崩溃、无限循环的问题了。本质上大部分问题都是因为错误释放链表节点、使用未初始化指针导致的悬空指针访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:19:29