little__cute 2019-11-14 22:36 采纳率: 0%
浏览 103

为什么在队尾插入元素时总是提示内存出错(C语言新人)

写了一个层序遍历创建二叉树的函数,但在入队列部分提示内存出错,求大佬指点...
出错函数:void EnQueue(BiTree e)
错误提示:内存出错

#include<stdio.h>
#include<stdlib.h>
#define link 1;
#define child 0; 

typedef struct BiTNode{
    char data;
    struct BiTNode* lchild;
    struct BiTNode* rchild;
    int LTag = child;
    int RTag = child;
}BiTNode,*BiTree;

typedef struct QNode{
    BiTNode* data;
    struct QNode* next;
}QNode,*QueuePtr;

typedef struct {
    QueuePtr front;//队头指针
    QueuePtr rear;//队尾指针
}LinkQueue;

LinkQueue Q;//用队列存储需要访问的树的结点

void IniiLinkQueue(){
    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
    Q.front->next = NULL;

    return ;
}

bool QueueEmpty(){
    //判断队列是否为空队列,若不是,返回true;否则,返回false
    if(Q.front == Q.rear)
        return false;
    return true; 
}

void EnQueue(BiTree e){
    //插入e为Q的新的队尾元素
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    p->data = e;
    p->next = NULL;
    Q.rear->next = p;//报错位置
    Q.rear = p;

    return ;
}

BiTree DeQueue(){
    //删除Q的队头元素,并返回其值
    BiTree e = Q.front->next->data;
    if(Q.front->next == Q.rear)
        Q.rear = Q.front;
    else
        Q.front->next = Q.front->next->next;
    return e;
}

void createBiTree(BiTree T){
    //按层序遍历创建二叉树
    char ch;

    EnQueue(T);//将树的根结点存入队列
    while(QueueEmpty()){
        while((ch = getchar()) != '\n'){
            T = DeQueue();
            if(ch != '-'){
                //若输入字符不为'-',表示当前结点不为空,将字符存入结点,并将其左右孩子地址存入队列中
                T->data = ch;
                T->lchild = (BiTree)malloc(sizeof(BiTNode));
                T->rchild = (BiTree)malloc(sizeof(BiTNode));
                EnQueue(T->lchild);
                EnQueue(T->rchild); 
            } 
            else{
                //若输入字符为'-',表示当前结点为空,无需将其左右孩子入队
                T->data = NULL; 
            }
        }
    }

    return ; 
}
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-29 17:31
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在C语言中,当尝试将一个空指针赋值给队列头部的下一个节点时,可能会出现内存分配失败。这通常发生在使用malloccalloc等动态内存分配函数时。

    你提到的问题是当你尝试从队列头部插入一个新的元素(例如通过调用EnQueue函数)时,遇到了内存分配失败的错误。这种错误通常是由于你在尝试分配一个指向空指针的内存空间。为了解决这个问题,你可以尝试以下几种方法:

    1. 检查变量初始化

      • 确保你的队列和指针变量都已经被正确地初始化。
      • 如果没有明确指定初始大小,确保所有分配的内存都是足够的。
    2. 检查数据类型

      • 确认你的数据结构中的每个元素都有足够的空间来容纳它自己以及它的两个子节点。
      • 如果你需要处理的数据量很大,考虑使用更大的数据结构或者更高效的算法来减少内存使用。
    3. 增加内存保护

      • 使用malloccalloc之前,先检查返回结果是否非零。
      • 在内存分配后,使用free释放任何不再需要的空间。
    4. 异常处理

      • 尽可能地添加一些错误处理机制,以便于捕获并报告内存分配失败的情况。
      • 在关键操作前后添加适当的检查语句,以防止意外的操作导致内存问题。
    5. 文档说明

      • 提供清晰、完整的文档说明,包括如何正确地使用你的程序。
      • 如果可能的话,提供示例代码和预期行为,帮助他人理解你的意图。
    6. 代码审查

      • 请求同事或团队成员进行代码审查,他们可能会发现你忽略的小细节或可能导致的问题。
    7. 调试工具

      • 使用调试器和日志记录功能来定位问题发生的具体上下文。
    8. 性能分析

      • 评估你的应用程序在各种负载条件下的性能,特别是涉及大量内存分配和释放的操作。
      • 分析这些操作对系统的影响,看看是否有可以优化的地方。
    9. 内存管理最佳实践

      • 学习和遵循良好的内存管理原则,比如避免不必要的内存分配和释放、合理使用堆栈和静态存储区等。

    以上是一些常见的解决方案,具体取决于你的具体场景和需求。希望这些信息对你有所帮助!

    评论

报告相同问题?

悬赏问题

  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!