莫名其妙的运行时错误

xinshou000 2007-05-13 08:45:34
我用先根遍历的方式写了一个关于二叉树建立和遍历算法的程序,编译没有任何问题,可就是在主函数中运行时出现了出现错误的对话框,提示信息是一些看不明白的汇编代码.
我用的是devC++ 4.9.9.2,程序是老师在课堂上用turboc2.0演示成功的源程序,通过调试,建立二叉树的算法是成功了,可到了便利算法的程序时候就出现了错误,是不是编译器的问题呢?谢谢
...全文
361 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xinshou000 2007-05-14
  • 打赏
  • 举报
回复
to:medie2005
谢谢你的指点.对于一般变量的传值调用和传地址调用我很清楚,只是对于这里的指针变量的传递没有搞清楚,还是要谢谢你,接下来就是好好调试调试了,希望以后能得到你的指点.
medie2005 2007-05-14
  • 打赏
  • 举报
回复
揭贴!
medie2005 2007-05-14
  • 打赏
  • 举报
回复
============================================
而且int createBTree(BTree T)不需要改动
============================================

楼主的基本功太不扎实了,也太懒了。

如果参数类型是BTree T,建立二叉树的过程的确无问题,但是只是表面上无问题而已!

如果参数类型是BTree T,你在函数createBTree(BTree T)中的所谓的给T分配内存、给T.data赋值这些操作的结果是无法保存下来的!

因为函数的参数类型是BTree T,是传值!传值与引用是不同的!

引用才可以保存你在createBTree(BTree T)中的所谓的给T分配内存、给T.data赋值这些操作的结果!传值与引用的区别你不会也不知道吧?

因此,在遍历时,函数int print(BTree T)中“printf("%c",T->data);”的T并未分配内存!因为以前的分配结果并没被保存下来!所以会提示“ 'XXX'指令引用的'XXXX'内存。该内存不能为'read'。”!

我昨天在DevC++ 4.9.9.2调试过了,改正后的代码已经贴上了。楼主连试都不试一下,让人寒心!


另外,如果你贴的代码真的是你老师在课堂上用的源程序,那你那个老师也是个垃圾!以后不用理他(她)了!

medie2005 2007-05-14
  • 打赏
  • 举报
回复
楼主搞什么啊?

我给你改的代码已经能在DevC++ 4.9.9.2运行无误了,楼主连我改的程序看都没看?
xinshou000 2007-05-13
  • 打赏
  • 举报
回复
我把程序写下便于大家分析:
#define MAX_TREE_DEGREE 10
#include<stdio.h>
#include<stdlib.h>
typedef struct BTnode{
char data;
struct BTnode* lchild;
struct BTnode* rchild;
}BTnode,*BTree;
//建立树
int createBTree(BTree T){
char ch;
if((ch = getchar())== ' ')
T = NULL;
else{
if(!(T=(BTnode*)malloc(sizeof(BTnode))))
return -1;
T->data = ch;
createBTree(T->lchild);
createBTree(T->rchild);
}
return 1;
}
//遍历

int preOrdTr1(BTree T){
if(T){
if(print(T))
if(preOrdTr1(T->lchild));
if(preOrdTr1(T->rchild));
return 1;
return 0;
}else return 1;
}

//print函数
int print(BTree T){
printf("%c",T->data);
return 1;
}
//主函数
int main(){
BTree T;
createBTree(T);
preOrdTr1(T);
system("pause");
return 0;
}
// 显示"****程序出现错误,对于此表示抱歉什么",谢谢大家分析
xinshou000 2007-05-13
  • 打赏
  • 举报
回复
我用的就是ANSI 标准的DevC++ 4.9.9.2啊,就是不过,程序应该没有问题,而且int createBTree(BTree T)不需要改动,就是在遍历的时候出现问题.我看老师用TC的时候竟然能通过,但是TC对标准支持的不多好,所以我就没有用TC.
出现了这个问题好长时间就是不知道怎么办?
yelling 2007-05-13
  • 打赏
  • 举报
回复
与这个相同的问题我以前回答过 也是TC上过 其他编译器不过 建议初学者不要用TC 用ANSI 标准C/C++ 的编译器
Estfania 2007-05-13
  • 打赏
  • 举报
回复
估计是运行支持库有问题;
版本不正确
medie2005 2007-05-13
  • 打赏
  • 举报
回复
改正后的程序如下:


#include<stdio.h>
#include<stdlib.h>

#define MAX_TREE_DEGREE 10

typedef struct BTnode{
char data;
struct BTnode* lchild;
struct BTnode* rchild;
}BTnode,*BTree;

int print(BTree T){
printf("ch==%c",T->data);
return 1;
}

int createBTree(BTree &T){ //此处原来的函数参数类型错误!
char ch;
ch = getchar();
if((ch)== ' ')
T = NULL;
else{
if(!(T=(BTnode*)malloc(sizeof(BTnode))))
return -1;
T->data = ch;
createBTree(T->lchild);
createBTree(T->rchild);
}
return 1;
}

int preOrdTr1(BTree T){
if(T){
if(print(T))
if(preOrdTr1(T->lchild));
if(preOrdTr1(T->rchild));
return 1;
return 0;
}else return 1;
}

int main(){
BTree T;
createBTree(T);
preOrdTr1(T);
system("pause");
return 0;
}
medie2005 2007-05-13
  • 打赏
  • 举报
回复
函数int createBTree(BTree T)的参数类型错误!

在创建前后,节点的数据域data是变化的(未创建时为空),并且必须要保存输入节点的数据data。因此,int createBTree(BTree T)中参数类型应该是引用,即BTree &T。


因此:
int createBTree(BTree T) 改为 int createBTree(BTree &T)。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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