0xC0000005: 写入位置 0x00000000 时发生访问冲突 C语言 二叉树非递归遍历

#include <stdio.h>
#define ElemType char
//节点声明,数据域、左孩子指针、右孩子指针
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序建立二叉树
BiTree CreateBiTree(){
char ch;
BiTree T;
scanf("%c",&ch);
if(ch=='#')T=0;
else{
T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = CreateBiTree();
T->rchild = CreateBiTree();
}
return T;//返回根节点
}
void push(struct su *s,BiTree T){
s->top++=T;
}
BiTree pop(struct su *s){
BiTree U;
s--;
U=s->top;
return U;
}
void feidigui(struct su *s,BiTree T){
if (T){
while (T)
{printf("%c",T->data);
if (T->lchild) {push(s,T);
T=T->lchild;}
else if (T->rchild) T=T->rchild;
else if (s->top-s->base) T=pop(s);
else T=0;
}
}}
//先序遍历二叉树
void PreOrderTraverse(BiTree T){
if(T){
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历
void InOrderTraverse(BiTree T){
if(T){
PreOrderTraverse(T->lchild);
printf("%c",T->data);
PreOrderTraverse(T->rchild);
}
}
//后序遍历
void PostOrderTraverse(BiTree T){
if(T){
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
printf("%c",T->data);
}
}
void main(){
BiTree T;
struct su{
BiTree *base;
BiTree *top;
}*s;
T = CreateBiTree();//建立
feidigui(s,T);
PreOrderTraverse(T);//输出
PostOrderTraverse(T);
getchar();
}

编译可以通过 但是运行中会中断
0x00D918F6 处的第一机会异常(在 ConsoleApplication4.exe 中): 0xC0000005: 写入位置 0x00000000 时发生访问冲突。
0x00D918F6 处有未经处理的异常(在 ConsoleApplication4.exe 中): 0xC0000005: 写入位置 0x00000000 时发生访问冲突。
线程 0x34ac 已退出,返回值为 -1073741510 (0xc000013a)。

你在主函数进行非递归调用时用到栈s,但s是一个指针,而你调用之前没有构造s,即s是一个野指针。并且栈的结构也定义错误, 正确的主函数应该如下
void main(){
BiTree T;
struct su{
BiTNode *base;
BiTNode *top;
}*s;
T = CreateBiTree();//建立
s = (su*) malloc (sizeof(su)); //构造一个栈
s->base = s->top = (BiTNode*) malloc (X * sizeof(BiTNode)); //初始化为空栈,容量X自己去定
feidigui(s,T);
PreOrderTraverse(T);//输出
PostOrderTraverse(T);
getchar();
}
温馨提示:内容为网友见解,仅供参考
无其他回答

0xC0000005: 写入位置 0x00000000 时发生访问冲突 C语言 二叉树非递归...
你在主函数进行非递归调用时用到栈s,但s是一个指针,而你调用之前没有构造s,即s是一个野指针。并且栈的结构也定义错误, 正确的主函数应该如下 void main(){ BiTree T;struct su{ BiTNode *base;BiTNode *top;}*s;T = CreateBiTree();\/\/建立 s = (su*) malloc (sizeof(su)); \/\/...

相似回答