C++链表代码输入字符串后display方法无法显示内容问题咨询
问题排查
你的代码核心问题既不是字符串赋值逻辑错误,也不是链表节点的string实现异常,是类成员指针未初始化导致的未定义行为,具体问题如下:
- 核心问题:
MovieList类没有定义构造函数,成员变量head是野指针,不会默认初始化为NULL
你在appendNode里判断if (!head)时,野指针的值是随机的,大概率不满足判断条件,程序会直接进入else分支,拿着野指针nodePtr = head去遍历内存,在while (nodePtr->next)这一步访问非法内存,被操作系统直接终止,所以你看不到后续displayList的输出,看起来就像输入后直接退出。 - 次要问题:头文件引入错误,你引入的
<string.h>是C语言处理char*字符串的头文件,C++的std::string需要引入<string>头才符合规范,部分编译器如果没有隐式引入可能会引发异常。
修复方案
- 给
MovieList类添加构造函数,初始化head为nullptr(C++11及以后版本推荐用nullptr代替NULL) - 把头文件
<string.h>替换为<string> - 可选补充:添加析构函数释放链表内存,避免内存泄漏
修复后可正常运行的代码如下:
#include <iostream> // 替换原string.h为C++标准string头 #include <string> using namespace std; class MovieList { private: struct MovieNode { string title; struct MovieNode *next; }; MovieNode *head; public: // 新增构造函数初始化head指针 MovieList() : head(nullptr) {} // 可选新增析构函数释放链表内存,避免泄漏 ~MovieList() { MovieNode* curr = head; while (curr) { MovieNode* next = curr->next; delete curr; curr = next; } } void appendNode(string var); void displayList(); }; void MovieList::appendNode(string var) { MovieNode *newNode, *nodePtr; newNode = new MovieNode; newNode->title = var; newNode->next = nullptr; if (!head) { head = newNode; } else { nodePtr = head; while (nodePtr->next) nodePtr = nodePtr->next; nodePtr->next = newNode; } cout << endl << "Input has been successfull!" << endl; } void MovieList::displayList() { MovieNode *nodePtr; if (head == nullptr) { cout << "The list is empty!" << endl; } else { cout << "The nodes in the List are... " << endl; nodePtr = head; while (nodePtr) { cout << nodePtr->title << endl; nodePtr = nodePtr->next; } } } int main() { MovieList list; string var; cout << " << Enter Movie >> " << endl << endl; cout << "Enter a movie: "; getline(cin, var); list.appendNode(var); list.displayList(); return 0; }
内容的提问来源于stack exchange,提问作者joseph renzo navarrosa
相关产品推荐
相关产品推荐

