吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 774|回复: 3
收起左侧

[已解决] 为什么运行会报错

[复制链接]
d173220523 发表于 2020-8-16 14:27
本帖最后由 d173220523 于 2020-8-18 13:50 编辑

已知二叉树以二叉链表存储,编写算法完成:对于树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间
[C] 纯文本查看 复制代码
#include <iostream>
#define MaxSize 50 //定义栈中元素的最大个数
typedef struct BiTNode{
        char data; //数据域
        struct BiTNode *lchild, *rchild; //左、右孩子指针
}BiTNode,*BiTree;
//链式队列结点
typedef struct LinkNode{
        BiTNode * data;
        struct LinkNode *next;
}LinkNode;
typedef struct{
        LinkNode *front,*rear; //队头队尾 
}LinkQueue;
//初始化队列(带头结点)
void InitQueue(LinkQueue &Q){
        Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode)); //建立头结点
        Q.front->next=NULL; //初始为空
}
//判断队列是否为空(带头结点)
bool IsEmpty(LinkQueue Q){
        if(Q.front==Q.rear)
                return true;
        else
                return false; 
}
//新元素入队(带头结点)
void EnQueue(LinkQueue &Q,BiTree x){
        LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
        s->data=x;
        s->next=NULL; //创建新结点,插入到链尾
        Q.rear->next=s;
        Q.rear=s; 
}
//队头元素出队(带头结点)
bool DeQueue(LinkQueue &Q,BiTree &x){
        if (Q.front==Q.rear) 
                return false;//空队
        LinkNode *p=Q.front->next;
        x=p->data;
        Q.front->next=p->next;
        if(Q.rear==p)
                Q.rear=Q.front; //若原队列中只有一个结点,删除后变空
        free(p);
        return true;
}
BiTree PrelnCreat(char* in, char* pre, int n){
        if(n == 0)
                return NULL;
        BiTree p = new BiTNode;
        p->data = *pre;
        for(int i = 0;i < n; i++)
                if(in[i] == *pre)
                        break;
                p->lchild = PrelnCreat(in, pre +1, i);
                p->rchild = PrelnCreat(in + i + 1, pre + i + 1, n - (i + 1));
                return p;
}
void Deletex(BiTree T){
        if(T){
                Deletex(T->lchild);
                Deletex(T->rchild);
                free(T);
        }
}
void Delete(BiTree T,char x){
        LinkQueue Q;
        InitQueue(Q);//初始化辅助队列
        BiTree p,q;
        EnQueue(Q,T);//将根结点入队
        while(!IsEmpty(Q)){//队列不空则循环
                DeQueue(Q, p);//队头结点出队
                printf("%c",p->data);//访问出队结点
                if(p->lchild->data==x){
                        Deletex(p->lchild);
                        p->lchild=NULL;
                }
                if(p->rchild->data==x){
                        Deletex(p->rchild);
                        p->rchild=NULL;
                }
                if(p->lchild)
                        EnQueue(Q,p->lchild);//左孩子入队
                if(p->rchild)
                        EnQueue(Q,p->rchild);//右孩子入队
        }
}
int main(){
        char* pr="GDAFEMHZ";
        char* in="ADEFGHMZ";
        BiTree t=PrelnCreat(in,pr,8);
        Delete(t,'E');
        printf("\n"); 
        return 0;
}
L-2020-08-16-15-19-53.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Unexpectedly 发表于 2020-8-16 14:58
不是,没有报错信息吗?把报错信息 贴上啊
无名氏wyw 发表于 2020-8-16 15:33
52行:
[C++] 纯文本查看 复制代码
for(int i = 0;i < n; i++)
                if(in[i] == *pre)
                        break;
                p->lchild = PrelnCreat(in, pre +1, i);
                p->rchild = PrelnCreat(in + i + 1, pre + i + 1, n - (i + 1));
                return p;

是不是少了大括号?在我的编译器上根本跑不动
无名氏wyw 发表于 2020-8-16 15:37
使用windows 10 专业版 2004 +MingW4.9.2 64位编译,使用gdb调试,在74(添加括号后75)行时出错:
[C++] 纯文本查看 复制代码
if(p->lchild->data==x){
                        Deletex(p->lchild);
                        p->lchild=NULL;
                }

应该是试图访问空指针
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 13:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表