链表程序选选项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
相关产品推荐
相关产品推荐

