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

C++实现链表数组遇异常:节点插入异常且输出随机数据求助

链表数组实现的问题排查

核心错误点分析

你的代码出现随机值输出、插入逻辑失效的问题,根源在于三个关键错误:

  • 错误1:链表头节点初始化错误
    在Creation函数中,tab[i] = new processus[m];是完全错误的操作。你需要的是每个数组元素作为链表的头指针(初始为空),但这里却分配了一个包含m个processus对象的数组,这些对象的成员(id、prio、etat、suiv)都是未初始化的垃圾值,导致打印时出现随机数。

  • 错误2:链表尾插函数的参数传递错误
    insertF函数的参数是processus* tab(值传递),当你在函数内部修改tab = last时,只会修改局部变量的指向,不会影响外部的链表头指针。必须改成引用传递processus*& tab,才能让头指针的更新同步到外部。

  • 错误3:链表销毁逻辑错误
    main函数中delete[] tab[i];是错误的,因为tab[i]现在是链表的头节点指针,不是动态分配的数组。应该调用你已经实现的supprimer函数来逐个销毁链表节点。

修正后的完整代码

#include <iostream>
using namespace std;

struct processus {
    int id;
    int prio;
    int etat;
    processus* suiv;
};

void inserD(processus*& D, int x, int y, int z)
{
    processus* nouv = new processus;
    nouv->id = x;
    nouv->prio = y;
    nouv->etat = z;
    nouv->suiv = D;
    D = nouv;
}

void afficher(processus** tab, int M)
{
    int i, j = 1;
    for (i = 0; i < M; i++) {
        processus* c = tab[i];
        cout << "Liste " << i+1 << ":" << endl;
        while (c != nullptr) {
            cout << j << "-->\t";
            cout << c->id << " ";
            cout << c->prio << " ";
            cout << c->etat << endl;
            c = c->suiv;
            j++;
        }
        cout << "\n";
    }
}

void supprimer(processus*& D)
{
    processus* supp;
    while (D != nullptr) {
        supp = D;
        D = D->suiv;
        delete supp;
    }
}

// 修改为引用传递
void insertF(processus*& tab, int x, int y, int z)
{
    processus* last = new processus;
    last->id = x;
    last->prio = y;
    last->etat = z;
    last->suiv = nullptr; // 用nullptr更规范

    if (tab == nullptr) {
        tab = last;
    }
    else {
        processus* c = tab;
        while (c->suiv != nullptr) {
            c = c->suiv;
        }
        c->suiv = last;
    }
}

void Creation(processus** tab, int l, int m)
{
    int x, y, z, i, j;
    for (i = 0; i < l; i++) {
        tab[i] = nullptr; // 初始化链表头为空指针,而非分配数组
        for (j = 0; j < m; j++) {
            cout << "Liste " << i+1 << ", processus " << j+1 << endl;
            cout << "donner id:";
            cin >> x;
            cout << "donner prio:";
            cin >> y;
            cout << "donner etat:";
            cin >> z;
            insertF(tab[i], x, y, z);
        }
    }
}

int main()
{
    int l, m;
    cout << "entrer le nombre des listes:";
    cin >> l;
    cout << "entrer le nombre de processus dans chaque liste:";
    cin >> m;

    processus** tab = new processus*[l];
    for (int i = 0; i < l; i++) {
        tab[i] = nullptr; // 初始化每个头指针为空
    }

    Creation(tab, l, m);
    afficher(tab, l);

    // 销毁每个链表
    for (int i = 0; i < l; i++) {
        supprimer(tab[i]);
    }
    delete[] tab;

    return 0;
}

额外优化说明

  • 用nullptr替代0或NULL,这是C++11及以后的规范写法,类型更安全。
  • 打印函数中增加了链表编号,输出更清晰。
  • Creation函数中增加了当前操作的链表和进程编号提示,提升交互体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:30:41