LinkQueue <BinaryNode<Elemtype>*>\\&Q 报错
时间: 2023-08-16 10:07:10 浏览: 92
这个错误是因为在C++中,"&"符号不能放在模板参数中。如果想要传递一个指向LinkQueue <BinaryNode<Elemtype>*>类型的引用,应该这样写:
```
LinkQueue<BinaryNode<Elemtype>*>& Q
```
这样就能正确地传递一个LinkQueue <BinaryNode<Elemtype>*>类型的引用了。
相关问题
template<class ElemType> //Q为存放路径的顺序队列 void BinaryTree<ElemType>::FindPath( ElemType &x, LinkQueue <BinaryTreeNode<ElemType> *> &Q );
这段代码是二叉树类 BinaryTree 的成员函数 FindPath 的定义,该函数的作用是寻找从根节点到值为 x 的节点的路径,并将路径存入顺序队列 Q 中。
在这段代码中,BinaryNode<Elemtype> 出现错误是因为这个类型名没有定义。在函数的定义中,应该使用 BinaryTree<ElemType>::BinaryTreeNode<ElemType> 来代替 BinaryNode<Elemtype>,以确保类型名的正确性。修改后的代码如下所示:
```
template<class ElemType>
void BinaryTree<ElemType>::FindPath(ElemType &x, LinkQueue<BinaryTreeNode<ElemType>*> &Q)
{
BinaryTreeNode<ElemType> *p = root; //从根节点开始搜索
Q.Clear(); //清空队列
while (p != NULL && p->data != x) //如果节点不为空且节点的值不为x
{
Q.EnQueue(p); //将节点入队
if (x < p->data) p = p->leftChild; //如果x比节点值小,往左子树搜索
else p = p->rightChild; //否则往右子树搜索
}
if (p == NULL) Q.Clear(); //如果没有找到节点x,清空队列
else Q.EnQueue(p); //如果找到了节点x,将它入队
}
```
请修改以下代码,并使输出结果不变。 template <class ElemType> bool ExistPath(const AdjListDirGraph<ElemType> g, int i, int j) // 操作结果:判断有向图g中两个顶点i和j之间是否存在路径 { for (int i = 0; i < g.GetVexNum(); i++) { g.SetTag(i, false); } g.SetTag(i, true); LinkQueue<int> q; bool check = false; q.InQueue(i); while (!q.Empty()) { int u, w; q.OutQueue(u); for (w = g.FirstAdjVex(u); w >= 0; w = g.NextAdjVex(u, w)) { if (w == j || u == j) { check = true; } if (!g.GetTag(w)) { g.SetTag(w, true); q.InQueue(w); } } } return check; }
以下是修改后的代码,请核对:
```
template <class ElemType>
bool ExistPath(const AdjListDirGraph<ElemType>& g, int i, int j)
// 操作结果:判断有向图g中两个顶点i和j之间是否存在路径
{
for (int k = 0; k < g.GetVexNum(); k++)
{
g.SetTag(k, false);
}
g.SetTag(i, true);
LinkQueue<int> q;
bool check = false;
q.InQueue(i);
while (!q.Empty())
{
int u, w;
q.OutQueue(u);
for (w = g.FirstAdjVex(u); w >= 0; w = g.NextAdjVex(u, w))
{
if (w == j)
{
check = true;
break;
}
if (!g.GetTag(w))
{
g.SetTag(w, true);
q.InQueue(w);
}
}
if (check)
{
break;
}
}
return check;
}
```
主要的修改如下:
1. 在函数参数中加上了引用符号 `&`,以避免复制构造函数的调用;
2. 在函数内部将 `for` 循环控制变量名 `i` 改为了 `k`,以避免与函数参数 `i` 同名,导致出现意想不到的错误;
3. 在找到目标顶点 `j` 后,立即退出内层循环,并设置标志变量 `check` 为 `true`;
4. 在外层循环中增加了判断,若 `check` 为 `true`,则跳出循环。这是因为已经找到了目标顶点 `j`,不必再继续往下搜索,以提高效率。
阅读全文