Minimal, Complete, and Verifiable example.
#include <vector>
#include <string>
#include <iostream>
using namespace std;
class node
{
public:
vector<int> node_connections;
string content;
};
int find_remaining_paths(node & a) //reference causing crash
{
for (int i = 0; i < a.node_connections.size(); i++)
{
if (a.node_connections[i] != -1) //if not visited
{
a.node_connections[i] = -1; //path marked as visited
return i; //return index in nodes
}
}
return -1; //no paths remaining
}
void find_euler_circuits(vector<node> & nodes, node & a)
{
cout << a.content << " ";
int temp = find_remaining_paths(a); //finds next path in vector, if one exists
if (temp+1) //if there's a remaining path in node a
{
find_euler_circuits(nodes, nodes[a.node_connections[temp]]); //crashes here
}
return;
}
int main()
{
vector<node> nodes;
node a; //nodes[0]
node b; //nodes[1]
node c; //nodes[2]
node d; //nodes[3]
a.content = "a";
b.content = "b";
c.content = "c";
d.content = "d";
a.node_connections.push_back(1); // a --> b
a.node_connections.push_back(3); // a --> d
b.node_connections.push_back(2); // b --> c
c.node_connections.push_back(0); // c --> a
nodes.push_back(a);
nodes.push_back(b);
nodes.push_back(c);
nodes.push_back(d);
find_euler_circuits(nodes, nodes[0]); // a is starting node
}
我正试图在多图中找到所有的euler路径。在这种情况下,使用节点来表示顶点。这是个主意:
例如:
nodes[0] holds node a
nodes[1] holds node b
nodes[2] holds node c
nodes[3] holds node d
Connections:
a --> b
a --> d
b --> c
c --> a
因此节点'a'保存索引整数1,3(b,d)
节点'b'包含索引整数2(c)
节点'c'包含索引整数0(a)
使用递归,程序跨越图表:
(a[0] = b) -> (b[0] = c) -> (c[0] = a) -> (a[1] = d)
(我知道这种方法找不到euler路径,但我必须先让它工作)
逻辑本身工作正常,如果我删除引用&amp;然后它只是永远循环[0] - &gt; b [0] - &gt; c [0] - &gt; a [0] - &gt;等,但随着参考,它到达
后立即崩溃find_euler_circuits(nodes, nodes[a.node_connections[temp]]);
有人能告诉我为什么会导致上述程序出现分段错误吗? 引起崩溃的引用在
中int find_remaining_paths(node & a) //loops forever without &, crashes with &
此外,递归应该在它到达没有路径的节点时立即停止,但这不是问题所在,因为它在访问一个节点后崩溃
答案 0 :(得分:1)
要回答有关“删除引用”为何会使其永久循环的部分问题:&
的原型上没有引用(find_euler_circuits
),因此它看起来像find_euler_circuits(vector<node> nodes, node a)
< em>如果这就是你的意思(*)那么你正在制作载体和节点的副本 - 它会在其中制作载体的副本 - 每次拨打电话时,您设置为-1的值都不在您认为的数组中。
当你拥有引用时它崩溃的原因 - 在find_remaining_paths
中你将a.node_connections[i]
设置为-1,然后返回i,然后在调用者中引用{ {1}} ...即-1。至少,这就是我在阅读代码的方式......
(*)你真的应该提供你在“删除引用”时得到的代码,无论这意味着什么。