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

我的简易链表打印代码无法运行,请问问题出在哪里?

链表打印异常?咱来揪出代码里的坑!

嘿,我瞅了你的链表构建代码,虽然你没贴打印函数,但这里面的几个问题绝对会导致打印出问题,咱们一步步捋:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:30:36