love_lla 2023-10-27 16:30 采纳率: 50%
浏览 5

运行超时了,可以看看怎么修改代码吗

题目:设计一个以链表为基础的学生信息管理,系统中包含五个函数的实现,具体功能如下:

Linked* Create():创建并返回一个空链表;

void InsertAfter(Linked *node,int num,float sc):在 node 所指节点之后插入一个新节点,并用参数 num ,sc 的值分别初始化新节点的成员变量学号和分数;

void DeleteAfter(Linked *node):删除 node 节点之后的节点;

Linked* GetByIndex(Linked *head,int index):返回 head 所指链表中索引为 index 的节点,比如当 index 为 0 时,返回的应该是头结点之后的第一个节点;

void PrintAll(Linked *head):按照<学号> <分数>的格式打印链表中所有节点的成员变量的值,每个一行。
代码:

#include <iostream>
using namespace std;
struct Linked {
    //结构体的成员变量
    int number;
    float score;
    Linked *next;
};
Linked* Create() {
    //创建并返回一个新链表
     Linked*a = new Linked;
    a->number = 0;
    a->score = 0;
    a->next = NULL;
    return a;
}
void InsertAfter(Linked* node, int num, float sc){
    //在指定节点后插入一个新节点,内容由 nu//m,sc 参数指定
 Linked*newnode = new Linked;
    if (node->number == 0 && node->score == 0)
    {
        node->number = num;
        node->score = sc;
       // delete newnode;
    }
    else
    {
        newnode->number = num;
    newnode->score = sc;
    newnode->next = node->next;
    node->next = newnode;
    }  
}
void DeleteAfter(Linked* node) {
    //删除此节点之后的一个节点
    if (node->next == NULL)
        return;
    else {
        node->next = node->next->next; }
}

Linked* GetByIndex(Linked* head, int index) {
    //返回指定索引处的节点
    Linked* p = head;
    int i = 0;
    while (i < index) {
        p = p->next;
        i++;
    }
    return p;
}
void PrintAll(Linked* head) {
    //按格式打印此链表中所有节点的成员变量
    while (head) {
        cout << head->number << " " << head->score << endl;
        head = head->next;
    }
}
int main()
{
    int num;
    float score;
    cin >> num >> score ;
    Linked *lk = Create();
    InsertAfter(lk,num,score);
    cin >> num >> score ;
    InsertAfter(GetByIndex(lk,0),num,score);
    cin >> num >> score ;
    InsertAfter(GetByIndex(lk,1),num,score);
    DeleteAfter(GetByIndex(lk,0));
    PrintAll(lk);
}

  • 写回答

2条回答 默认 最新

  • 一休哥助手 后端领域优质创作者 2023-10-27 16:32
    关注

    AI回答网站:https://www.fudai.fun/
    在这段代码中,主要出现了两个问题导致运行超时:

    在插入节点时,没有正确处理头节点为空的情况。在InsertAfter函数中,当传入的节点为空时,应该创建一个新的头节点并赋值,而不是直接赋值给传入的节点。所以需要修改InsertAfter函数的实现如下:

    cpp
    void InsertAfter(Linked* node, int num, float sc) {
        Linked* newnode = new Linked;
        newnode->number = num;
        newnode->score = sc;
        newnode->next = NULL;
    
        if (node == NULL) {
            node = newnode;
        } else {
            newnode->next = node->next;
            node->next = newnode;
        }
    }
    
    

    在删除节点时,没有正确释放内存。在DeleteAfter函数中,当删除节点后,应该释放被删除节点的内存,否则会导致内存泄漏。所以需要修改DeleteAfter函数的实现如下:

    cpp
    void DeleteAfter(Linked* node) {
        if (node == NULL || node->next == NULL) {
            return;
        }
    
        Linked* temp = node->next;
        node->next = temp->next;
        delete temp;
    }
    
    

    修改完以上两个问题后,代码应该可以正常运行了。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月27日

悬赏问题

  • ¥15 vb6.0+webbrowser无法加载某个网页求解
  • ¥15 RPA财务机器人采购付款流程
  • ¥15 计算机图形多边形及三次样条曲线绘制
  • ¥15 根据protues画的图用keil写程序
  • ¥200 如何使用postGis实现最短领规划?
  • ¥15 pyinstaller打包错误
  • ¥20 cesm的气溶胶排放文件
  • ¥15 逐月累计,月份不连续,补齐月份
  • ¥15 应用简单的Python代码完成一个学生成绩管理系统
  • ¥15 用matlab求微分方程初值问题