菜鸟求助一个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;
}