OJ Memory Limit Exceeded 问题,为啥会溢出?

新手上路,请多包涵

OJ 题目来源:https://turingjudge.com
作业->编程基础练习营4->1026统计学生信息(使用动态链表完成)

主要若我将结构体中 score 的类型改为整数就内存溢出,改为浮点数就错误,只能用字符串才可以;想不通为什么这样会溢出,浮点数还直接0分了;可否有大神能指点一二?非常感谢

MLE代码:

#include <iostream>
#include <string.h>
using namespace std; 

struct Node {
    char sex;
    int  age;
    int score;
    struct Node *pre;
    struct Node *nxt;
    char number[30];
    char name[50];
    char address[50];
};

struct Node *head;
struct Node *tail;

void inputNode(struct Node t);
void outputNode(struct Node *n);

int main() {

    head = new(struct Node);
    head->pre = NULL;
    head->nxt = NULL;
    cin >> head->number;
    if (strcmp( head->number, "end")==0 ) {
        cout << endl;
        return 0;
    }
    cin >> head->name >> head->sex >> head->age >> head->score >> head->address;
    tail = head; 
    
    while (1) {
        struct Node t;
        cin >> t.number;
        if (strcmp(t.number, "end") == 0) { break; }
        cin >> t.name >> t.sex >> t.age >> t.score >> t.address;
        inputNode(t);
    }
    

    struct Node *t = tail;
    while (t != NULL) {
        outputNode(t);
        t = t->pre;
    }
    
    return 0;
}

void outputNode(struct Node *n) {
    cout << n->number << ' ' << n->name << ' ' << n->sex << ' ' << n->age << ' ' << n->score << ' ' << n->address << endl;
}

void inputNode(struct Node t) {
    struct Node *n = new(struct Node);
    strcpy(n->number, t.number);
    strcpy(n->name, t.name);
    n->sex=t.sex;
    n->age=t.age;
    n->score=t.score;
    strcpy(n->address, t.address);
    
    tail->nxt = n;
    n->nxt = NULL;
    n->pre = tail;
    tail = n;
}
阅读 5.1k
1 个回答
  1. memory limit exceeded 的原因是因为你的第一个 while 循环(就是读取数据的那个循环)死循环了,之后不断地创建新的node,造成内存超过了题目的要求。
  2. 死循环的原因是因为分数有可能是浮点数,例如10.0,20.0,20.1等,当cin读入的时候,只会读取前面的整数部分,所以,"end" 不会读入的t.number中。
  3. 至于为啥分数使用浮点数还会错误,原因就在于题目没有给出浮点数的输出格式,例如保留几位小数,所以必须使用字符串保存分数,即保存数据的原始格式

综上,啥破题目

ps:
建议:1.倒序输出可以学习一下,链表的头插法,这样只需要单链表就可以了

  1. 另外循环内部直接new节点就可以了,不要创建一个栈上的变量,会变慢
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题