c++调试错误

良仔 2011-05-06 09:54:40
/BiTree.h
#ifndef BITREE_H
#define BITREE_H


const int ok = 1;
const int error =-1;

typedef struct Node
{
char date;
Node *lchild,*rchild;
}*TreeNode;

class BiTree
{
public:
BiTree();
~BiTree();
TreeNode CreatBiTree(TreeNode root);
void PreOrder(TreeNode root);
};
#endif

//BiTree.cpp
#include<iostream.h>
#include<stdio.h>
#include"BiTree.h"

BiTree::BiTree(){};
BiTree::~BiTree(){};
TreeNode BiTree::CreatBiTree(TreeNode root)
{
char ch;
ch = getchar();
if(ch == '^')
root = NULL;
else
{
root = new Node;
root->date = ch;
CreatBiTree(root->lchild);
CreatBiTree(root->rchild);
}
return root;
}

void BiTree::PreOrder(TreeNode root)
{
if(root != NULL)
{
cout<<root->date<<endl;
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
编译,链接都没问题,调试跟踪时在cout<<root->date<<endl;
发现这个错误First-chance exception in BiTree.exe: 0xC0000005: Access Violation.
有人说是因为root->lchild和root->rchild是野指针,如果是,怎么改正。求解。
...全文
94 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
良仔 2011-05-06
  • 打赏
  • 举报
回复
谢谢9楼。
良仔 2011-05-06
  • 打赏
  • 举报
回复
我很菜,不明白,再求详解。请高手指教。
yarpee 2011-05-06
  • 打赏
  • 举报
回复
综合3楼和5楼的建议:
1、显式地给lchild和rchild赋值为NULL
2、CreateBiTree的参数需要TreeNode &root或者TreeNode *root,理由如下:
假设如LZ的是TreeNode root,先创建了一个Node0,则root--->(指向)Node0
再调用CreateBiTree(root->lchid),此时形参root拷贝Node0->lchid值,新创建Node1,则root--->Node1,并不是Node0->lchild--->Node1。函数返回时你会丢掉Node1的链接。
delphiwcdj 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 x6u12e 的回复:]

5楼的方法可以,非常谢谢你,你能在详细介绍下,为什么要用引用么?
[/Quote]
因为形参是实参的拷贝,你应该明白了
良仔 2011-05-06
  • 打赏
  • 举报
回复
5楼的方法可以,非常谢谢你,你能在详细介绍下,为什么要用引用么?
良仔 2011-05-06
  • 打赏
  • 举报
回复
1楼的方法不行,if(root->date != NULL)有什么意义,root->date是个字符不是指针。
delphiwcdj 2011-05-06
  • 打赏
  • 举报
回复
试试
TreeNode BiTree::CreatBiTree(TreeNode root)
改为
TreeNode BiTree::CreatBiTree(TreeNode &root)
头文件里也改
無_1024 2011-05-06
  • 打赏
  • 举报
回复

#include "BinSTree.h"

BinSTree::BinSTree(void)
{
tj=false;
}


isilent 2011-05-06
  • 打赏
  • 举报
回复
lchild和rchild是野指针,在TreeNode的构造函数里把这两个置为null

PS 楼上的楼上,data又不是指针,没问题的吧
healer_kx 2011-05-06
  • 打赏
  • 举报
回复
说明你某个指针是NULL,然后访问了第二个元素。
jernymy 2011-05-06
  • 打赏
  • 举报
回复
楼主的错误明显是内存地址错误,root地址指向空了

加入保护

if (NULL != root)
{
if (NULL != root->date)
{
cout<<root->date<<endl;
}
}

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧