为什么运行会报错
本帖最后由 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;
} 不是,没有报错信息吗?把报错信息 贴上啊 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;
是不是少了大括号?在我的编译器上根本跑不动 使用windows 10 专业版 2004 +MingW4.9.2 64位编译,使用gdb调试,在74(添加括号后75)行时出错:
if(p->lchild->data==x){
Deletex(p->lchild);
p->lchild=NULL;
}
应该是试图访问空指针
页:
[1]