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

链表程序选选项5或9后自行终止的问题排查求助

问题分析与修复方案

1. display()函数崩溃原因

遍历链表的循环结束后,p已指向nullptr,此时执行cout << p->data << endl;会直接访问空指针,触发未定义行为导致程序终止。

修复后的display函数:

void display()
{
    node* p = list; // 使用局部指针,避免污染全局变量
    while (p != nullptr)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl; // 直接换行,无需访问空指针的data
}

2. insertSpec()函数崩溃原因

  • 全局指针p和q未初始化,直接执行p = p->next会访问野指针,引发崩溃。
  • 未检查输入的value是否超过链表实际长度,可能导致遍历越界。
  • 逻辑冗余,无需两个循环分别查找p和q,找到目标节点后q就是p->next。
  • 全局变量滥用,容易导致状态混乱。

修复后的insertSpec函数:

void insertSpec()
{
    cout << "Enter the number after which you want to enter a node=";
    int value;
    cin >> value;

    if (list == nullptr)
    {
        if (value > 1)
        {
            cout << "THERE IS NO OTHER NODE SO YOU CANNOT PUT A NODE AT " << value << endl;
        }
        else if (value == 1)
        {
            // 空链表时插入第一个节点,等同于头插
            int value2;
            cout << "ENTER THE NUMBER YOU WANT TO ENTER=";
            cin >> value2;
            node* newNode = new node();
            newNode->data = value2;
            newNode->next = nullptr;
            list = newNode;
        }
        return;
    }

    // 先计算链表长度,检查value是否合法
    int length = 0;
    node* temp = list;
    while (temp != nullptr)
    {
        length++;
        temp = temp->next;
    }

    if (value < 1 || value > length)
    {
        cout << "Invalid position! The list only has " << length << " nodes." << endl;
        return;
    }

    int value2;
    cout << "ENTER THE NUMBER YOU WANT TO ENTER=";
    cin >> value2;

    // 找到目标节点
    node* p = list;
    for (int count = 1; count < value; count++)
    {
        p = p->next;
    }

    node* newNode = new node();
    newNode->data = value2;
    newNode->next = p->next;
    p->next = newNode;
}

3. 额外优化点

  • 全局变量value, count, value2, count2以及全局指针p, q, r全部改为局部变量,避免全局状态污染,减少bug。
  • main函数中choice未初始化,可能导致首次循环行为异常,初始化int choice = 0;。

修复后的完整代码:

#include <iostream>

using namespace std;

struct node
{
    int data;
    node* next;
};

node* list = nullptr;

void insertFront()
{
    cout << "ENTER A VALUE=";
    int value;
    cin >> value;

    node* newNode = new node();
    newNode->data = value;
    newNode->next = list;
    list = newNode;
}

void display()
{
    node* p = list;
    while (p != nullptr)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

void insertSpec()
{
    cout << "Enter the number after which you want to enter a node=";
    int value;
    cin >> value;

    if (list == nullptr)
    {
        if (value > 1)
        {
            cout << "THERE IS NO OTHER NODE SO YOU CANNOT PUT A NODE AT " << value << endl;
        }
        else if (value == 1)
        {
            int value2;
            cout << "ENTER THE NUMBER YOU WANT TO ENTER=";
            cin >> value2;
            node* newNode = new node();
            newNode->data = value2;
            newNode->next = nullptr;
            list = newNode;
        }
        return;
    }

    int length = 0;
    node* temp = list;
    while (temp != nullptr)
    {
        length++;
        temp = temp->next;
    }

    if (value < 1 || value > length)
    {
        cout << "Invalid position! The list only has " << length << " nodes." << endl;
        return;
    }

    int value2;
    cout << "ENTER THE NUMBER YOU WANT TO ENTER=";
    cin >> value2;

    node* p = list;
    for (int count = 1; count < value; count++)
    {
        p = p->next;
    }

    node* newNode = new node();
    newNode->data = value2;
    newNode->next = p->next;
    p->next = newNode;
}

int main()
{
    int choice = 0; // 初始化choice
    cout << "1) Insert at front" << endl;
    cout << "5) Insert at specified place" << endl;
    cout << "9) Display" << endl;
    cout << "99) Exit" << endl << endl;

    while (choice != 99)
    {
        cout << "Your choice:";
        cin >> choice;

        switch (choice)
        {
        case 1:
            insertFront();
            break;
        case 5:
            insertSpec();
            break;
        case 9:
            display();
            break;
        case 99:
            cout << "PROGRAM TERMINATED :)" << endl;
            break;
        default:
            cout << "Invalid choice! Please try again." << endl;
        }
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:43:22