d173220523 发表于 2020-8-16 14:27

为什么运行会报错

本帖最后由 d173220523 于 2020-8-18 13:50 编辑

已知二叉树以二叉链表存储,编写算法完成:对于树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间
#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 == *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;
}

Unexpectedly 发表于 2020-8-16 14:58

不是,没有报错信息吗?把报错信息 贴上啊

无名氏wyw 发表于 2020-8-16 15:33

52行:
for(int i = 0;i < n; i++)
                if(in == *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)行时出错:
if(p->lchild->data==x){
                        Deletex(p->lchild);
                        p->lchild=NULL;
                }
应该是试图访问空指针
页: [1]
查看完整版本: 为什么运行会报错