我正在尝试实现Prims算法来查找给定图形的最小生成树。 代码现在编译,但可执行文件(而不是打印MST)打印“分段错误:11”。而且,我收到了警告:
Warning: control reaches end of non-void function
有人能帮我理解它有什么问题吗?提前谢谢。
double Graph::getWeight(int v, int w)
{
if(edge(v,w))
{
Node* t = adj[v];
while(t != NULL)
{
t = t->next;
if((t ->v) == w)
return t->weight;
}
}
}
答案 0 :(得分:7)
警告是指您的getWeight
函数表示它会返回double
,但实际上只会在某些条件下返回double
。如果if
语句为假(即,如果edge(v,1)
为false或者t->v == w
始终为false),则该函数不会返回任何内容。
如果条件不正确,也许你想要返回一些默认值。
这是否是导致细分错误的原因是另一回事。
答案 1 :(得分:0)
如果我理解正确,您的函数会尝试检索顶点v
和w
之间给定边的权重。
如果该边缘不存在,或者图形数据中不存在它们之间的权重,则该函数不会返回任何内容。
即使您知道您的数据结构将很好,您也应该确保操作它的代码可以对不良数据做出反应。
#include <exception>
#include <string>
/* ... */
double Graph::getWeight(int v, int w)
{
if(edge(v,w))
{
Node* t = adj[v];
while(t != NULL)
{
t = t->next;
if((t ->v) == w)
return t->weight;
}
}
std::string msg = "malformed graph: no edge between ";
msg += v;
msg += " and ";
msg += w;
throw std::runtime_error(msg);
}
如果图形格式不正确,上面至少会在运行时发出警告。您甚至可以根据发生的问题(edge(v,w)
为false或循环无法找到正确的权重)使其抛出两个不同的异常。
如果您知道图表格式不正确,可以尝试修复它,看看它是否也修复了您遇到的段错误。
答案 2 :(得分:-1)
这一部分只是一个更好的编码实践:
double Graph::getWeight(int v, int w)
{
double result = 0.0;
if(edge(v,w))
{
Node* t = adj[v];
while(t != NULL)
{
t = t->next;
if((t ->v) == w)
result=t->weight;
}
}
return result;
}