菜鸟求助一个C++程序的问题(求救查了很久都不知道该怎么解决)

长弓的坚持 2014-04-11 07:13:23
菜鸟编写了一个程序。程序编译通过了 但是运行时弹出以对话框上面是Run-Time Check Failure #3 - The variable 'r' is being used without being defined.
明明定义过了r,为什么说没定义?查了好久的问题都还是不知道怎么改,请好心人指点!非常感谢!代码如下所示:

#include<iostream>
#include<stack>
using namespace std;

template<class T>
class myqueue;

template<class T>
class Node
{
friend myqueue<T>;
private:
T data;
Node<T>* next;
public:
Node()
{
next=0;
}
Node(T d)
{
data=d;
next=0;
}
};
template<class T>
class myqueue
{
private:
Node<T> *tail;
public:
myqueue()
{
tail=new Node<T>();
//tail->next=NULL;
tail->next=tail; //这种表示采用的是循环队列,且队列头是一个哨兵为空,它的下一个才是队列的第一个数据
}

bool empty()
{
//return (NULL==tail->next)
return (tail->next==tail);
}

void push(T d)
{
Node<T> *p=new Node<T>(d);
//p->next=NULL;
p->next=tail->next;
tail->next=p;
tail=p; //始终标记出尾部的位置
}

T front() //取队列的第一个元素
{
if(empty())
{
cout<<"queue is empty!"<<endl;
exit(0);
}
Node<T> *p=tail->next; //这是一个循环链表构成的队列,尾部的链接的下一个就是队列头
T data=p->next->data; //队列头链接的下一个才是第一个数据
return data;
}

void pop() //队列的第一个元素出队列
{
Node<T> *p=tail->next;
Node<T> *q=p->next;
p->next=q->next;
if(q==tail)
tail=p;
delete q;
q=NULL;
}
};


class CStree; //children sibling tree

class CSnode
{
private:
char data;
CSnode *firstchild; //左孩子右兄弟
CSnode *nextsibling;
friend CStree;
};

class CStree
{
public:
void Create_Tree(CSnode *&T) //创建树
{
//按照从上到下,从左往右的顺序输入“双亲——孩子”的有序对,建立树的孩子兄弟存储结构
//输入时,以('#','#')为结束标志,根结点双亲为空,也是以'#'来表示
T=NULL;
myqueue<CSnode *> q; //队列中存放的是树的一个节点单元
char parent,child;
cout<<"输入双亲,孩子有序对,以'#','#'作为输入结束标志"<<endl;
for(cin>>parent>>child;child!='#';cin>>parent>>child)
{
CSnode *p=new CSnode;
CSnode *r=NULL; <<<<<<<<<<<<<<<<<<<<<<<这就是r出现的地方和开始使用的地方
p->data=child;
p->firstchild=p->nextsibling=NULL; //暂时现将它们置空
q.push(p);
if(parent=='#')
T=p; //根节点,同时T也是最后链接好的那棵树
else
{

CSnode *s=q.front(); //树的第一个节点单元,这个单元有parent数据、存放的孩子数据、左孩子指针、右兄弟指针
while(s->data!=parent) //第一次循环的时候data=a,第二次循环的时候data=b,parent=a,刚好错开了,通过parent的变化标注每次的链接
{
q.pop(); //清除的是myqueue中的data
s=q.front();
}
if(!s->firstchild) //链接第一个孩子结点
{
s->firstchild=p;
r=p; //设定r是为了方便后一步链接兄弟节点

}
else //链接兄弟结点
{

r->nextsibling=p;
r=p;
}
}
}//end_for
}//end_void


void PreRoot_Traverse(CSnode *T) //先根遍历 ,且是从左往右进行的
{
if(T)
{
cout<<T->data<<" ";
PreRoot_Traverse(T->firstchild); //递归,一个递归完了才能够进行另一个递归
PreRoot_Traverse(T->nextsibling);
}
}

void PostRoot_Traverse(CSnode *T) //后根遍历,且是从左往右进行的
{
if(T)
{
PostRoot_Traverse(T->firstchild);
cout<<T->data<<" ";
PostRoot_Traverse(T->nextsibling);
}
}

void LevelOrder_Traverse(CSnode *T) //层次遍历
{
myqueue<CSnode *> q;
CSnode *t;
q.push(T);
do
{
t=q.front();
do
{
cout<<t->data<<" ";
if(t->firstchild)
q.push(t->firstchild);
t=t->nextsibling;
}while(t); //把每一层遍历完再换到下一层
q.pop();
}while(!q.empty());
}
};


int main()
{
CStree tree;
CSnode *T;
tree.Create_Tree(T);


cout<<"树的先根遍历为:";
tree.PreRoot_Traverse(T);
cout<<endl;

cout<<"树的后根遍历为:";
tree.PostRoot_Traverse(T);
cout<<endl;

cout<<"层次遍历树为:";
tree.LevelOrder_Traverse(T);
cout<<endl;

return 0;
}




...全文
400 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
长弓的坚持 2014-04-22
  • 打赏
  • 举报
回复
引用 9 楼 PDD123 的回复:
[quote=引用 8 楼 wordwarwordwar 的回复:] [quote=引用 7 楼 PDD123 的回复:] [quote=引用 5 楼 wordwarwordwar 的回复:] [quote=引用 4 楼 PDD123 的回复:] 也能运行,就是可能输入不正确,总是在 s=q.front(); 这里执行到exit(0)
不太明白您的意思,您有运行过这个程序?能否在详细的告知一下呢,谢谢![/quote] 编译没有问题,运行之后也没有出现你说的问题,只不过总是执行到exit(0)而退出,再详细的就没有调试过了。[/quote] 想请问您是用什么编译的呢?我是用VS2012. 可能和编译器也有一定关系[/quote] VS2008[/quote] 非常感谢您的回答,分数都给你了
长弓的坚持 2014-04-18
  • 打赏
  • 举报
回复
引用 7 楼 PDD123 的回复:
[quote=引用 5 楼 wordwarwordwar 的回复:] [quote=引用 4 楼 PDD123 的回复:] 也能运行,就是可能输入不正确,总是在 s=q.front(); 这里执行到exit(0)
不太明白您的意思,您有运行过这个程序?能否在详细的告知一下呢,谢谢![/quote] 编译没有问题,运行之后也没有出现你说的问题,只不过总是执行到exit(0)而退出,再详细的就没有调试过了。[/quote] 想请问您是用什么编译的呢?我是用VS2012. 可能和编译器也有一定关系
PDD123 2014-04-18
  • 打赏
  • 举报
回复
引用 8 楼 wordwarwordwar 的回复:
[quote=引用 7 楼 PDD123 的回复:] [quote=引用 5 楼 wordwarwordwar 的回复:] [quote=引用 4 楼 PDD123 的回复:] 也能运行,就是可能输入不正确,总是在 s=q.front(); 这里执行到exit(0)
不太明白您的意思,您有运行过这个程序?能否在详细的告知一下呢,谢谢![/quote] 编译没有问题,运行之后也没有出现你说的问题,只不过总是执行到exit(0)而退出,再详细的就没有调试过了。[/quote] 想请问您是用什么编译的呢?我是用VS2012. 可能和编译器也有一定关系[/quote] VS2008
PDD123 2014-04-16
  • 打赏
  • 举报
回复
引用 5 楼 wordwarwordwar 的回复:
[quote=引用 4 楼 PDD123 的回复:] 也能运行,就是可能输入不正确,总是在 s=q.front(); 这里执行到exit(0)
不太明白您的意思,您有运行过这个程序?能否在详细的告知一下呢,谢谢![/quote] 编译没有问题,运行之后也没有出现你说的问题,只不过总是执行到exit(0)而退出,再详细的就没有调试过了。
chen6_lu 2014-04-16
  • 打赏
  • 举报
回复
编译木有错误,也能运行啊
长弓的坚持 2014-04-15
  • 打赏
  • 举报
回复
引用 4 楼 PDD123 的回复:
也能运行,就是可能输入不正确,总是在 s=q.front(); 这里执行到exit(0)
不太明白您的意思,您有运行过这个程序?能否在详细的告知一下呢,谢谢!
PDD123 2014-04-11
  • 打赏
  • 举报
回复
也能运行,就是可能输入不正确,总是在 s=q.front(); 这里执行到exit(0)
PDD123 2014-04-11
  • 打赏
  • 举报
回复
...................编译之后,变量名是不在可执行文件中的。
长弓的坚持 2014-04-11
  • 打赏
  • 举报
回复
引用 1 楼 hzdiy 的回复:
这个错应该是r为NULL的时候,你也访问了r的成员
但是我去掉了r的NULL之后,也就是定义为 CSnode *r,还是同样的运行错误
悊子 2014-04-11
  • 打赏
  • 举报
回复
这个错应该是r为NULL的时候,你也访问了r的成员

64,654

社区成员

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

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