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
相关产品推荐
相关产品推荐

