我的简易链表打印代码无法运行,请问问题出在哪里?
链表打印异常?咱来揪出代码里的坑!
嘿,我瞅了你的链表构建代码,虽然你没贴打印函数,但这里面的几个问题绝对会导致打印出问题,咱们一步步捋:
1. 输入函数里的cin和gets_s打架了!
你在getinput()里先用cin >> n->marks读整数,这货读完整数后,会把输入时敲的换行符留在输入缓冲区里。接下来gets_s(n->name)一跑,直接把这个换行符当成输入读进去,结果就是name变成空字符串了!后面打印的时候,姓名要么是空的,要么乱码,肯定不对。
怎么修?在cin读完分数后,把缓冲区里的换行符清掉就行:
cin >> n->marks; cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 要记得包含<limits>头文件哦 gets_s(n->name);
或者更推荐用C自带的cin.getline来读字符串,避免C和C输入函数混用的麻烦:
cin >> n->marks; cin.ignore(numeric_limits<streamsize>::max(), '\n'); cin.getline(n->name, sizeof(n->name));
2. C++里用malloc有点不地道
你用malloc分配节点内存,这是C语言的写法。malloc只会给你一块内存,不会调用结构体的构造函数(虽然你现在的结构体没自定义构造,但习惯上C++用new更稳妥),万一以后结构体加了构造函数,malloc就会搞出未初始化的问题。
换new就行:
node *n = new node;
记得后面销毁链表的时候要用delete对应释放内存哈。
3. 没检查内存分配失败的情况
在populateList()里,你直接把newptr挂到链表上,但如果malloc/new没分配到内存,newptr就是NULL。这会导致链表末尾挂个空节点,打印的时候要么崩溃,要么无限循环。
加个检查:
node *newptr = getinput(); if (!newptr) { cout << "内存不够啦,分配失败!" << endl; return list; }
4. 推测你的打印函数可能踩的坑
如果你的打印函数是遍历链表输出每个节点的分数和姓名,那前面的输入问题直接就会让输出异常。给你个靠谱的打印函数参考:
void printList(node *list) { node *temp = list; while (temp != NULL) { cout << "分数: " << temp->marks << ", 姓名: " << temp->name << endl; temp = temp->next; } }
最后给你修复好的完整代码片段
#include <iostream> #include <limits> using namespace std; typedef struct NODE { int marks; char name[100]; struct NODE *next; } node; node *getinput() { node *n = new node; if (n) { cin >> n->marks; cin.ignore(numeric_limits<streamsize>::max(), '\n'); cin.getline(n->name, sizeof(n->name)); n->next = NULL; } return n; } node *populateList(node *list) { node *newptr = getinput(); if (!newptr) { cerr << "内存分配失败" << endl; return list; } if (list == NULL) { list = newptr; return list; } node *temp = list; while (temp->next != NULL) { temp = temp->next; } temp->next = newptr; return list; } void printList(node *list) { node *temp = list; while (temp != NULL) { cout << "分数: " << temp->marks << ", 姓名: " << temp->name << endl; temp = temp->next; } } int main() { node *head = NULL; // 可以加个循环让用户输入多个节点 cout << "输入第一个节点(分数 姓名):" << endl; head = populateList(head); cout << "输入第二个节点(分数 姓名):" << endl; head = populateList(head); cout << "\n链表内容:" << endl; printList(head); // 记得添加内存释放逻辑,避免内存泄漏 node *temp; while (head != NULL) { temp = head; head = head->next; delete temp; } return 0; }
内容的提问来源于stack exchange,提问作者user73157
相关产品推荐
相关产品推荐

