输入格式如下
5
1 2 9.0
1 3 12.0
2 4 18.0
2 3 6.0
2 5 20.0
3 5 15.0
0
1 5
第一个数字是图表中的顶点数。然后下一行最多为0是图的边缘。第一个和第二个数字是顶点,第三个数字是边缘在它们之间的距离。尝试读取数据并将边缘存储到该顶点的List邻接中的位置。此示例将生成具有五个顶点的图形,其边缘为1到2& 3。 2至4& 3& 1等
输入四个数字后,我收到了分段错误。故障发生在线myGraph.vertexInfo [p1] .adjacency - >顶点= P2;哪里开始尝试存储信息。为什么我会遇到这个错误?
#include <cstdio>
using namespace std;
struct ListCell
{
ListCell* next;
int vertex;
double weight;
ListCell(int v, double w, ListCell* nxt)
{
vertex = v;
weight = w;
next = nxt;
}
};
typedef ListCell* List;
struct Vertex
{
bool signaled;
long distance;
List adjacency;
};
struct Graph
{
int numVertices;
Vertex* vertexInfo;
Graph(int n)
{
numVertices = n;
vertexInfo = new Vertex[n+1];
for(int i = 1; i <= n; i++)
{
vertexInfo[i].signaled = false;
}
}
};
//==============================================================
// readIn
//==============================================================
//
//==============================================================
void readIn()
{
int g;
int p1;
int p2;
float edge;
scanf("%i ", &g);
Graph myGraph(g);
scanf("%i", &p1);
while(p1 != 0)
{
scanf("%i", &p2);
scanf("%f", &edge);
myGraph.vertexInfo[p1].adjacency -> vertex=p2;
myGraph.vertexInfo[p2].adjacency -> vertex=p1;
myGraph.vertexInfo[p1].adjacency -> weight=edge;
myGraph.vertexInfo[p2].adjacency -> weight=edge;
scanf("%i", &p1);
}
}
//==============================================================
// main
//==============================================================
int main(int argc, char** argv)
{
readIn();
return 0;
}
答案 0 :(得分:1)
您没有遵循Vertex
的对象构造和初始化的一些基本原则。
构造Vertex
的实例时,没有任何关于成员数据值的可预测信息。我建议添加一个默认构造函数,将成员数据初始化为理智的东西。
struct Vertex
{
Vertex() : signaled(false), distance(0), adjacency(NULL) {}
bool signaled;
long distance;
List adjacency;
};
一旦你这样做,Graph
的构造函数可以简化为:
Graph(int n) : numVertices(n)
{
vertexInfo = new Vertex[n+1];
}
答案 1 :(得分:0)
adjacency
指针未初始化,因此在解除引用时会遇到问题。
答案 2 :(得分:0)
您必须初始化您的邻接成员:
Graph(int n)
{
numVertices = n;
vertexInfo = new Vertex[n+1];
for(int i = 1; i <= n; i++)
{
vertexInfo[i].signaled = false;
vertexInfo[i].adjacency = new ListCell(i, 0.0, 0);
}
}
答案 3 :(得分:0)
让我们来看看adjacency
是什么:
struct Vertex
{
bool signaled;
long distance;
List adjacency;
};
现在让我们来看看List
是什么:
typedef ListCell* List;
因此,adjacency
实际上是指向ListCell
的指针。没关系,我们可以解决这个问题。但在我们可以之前,我们必须确保adjacency
实际指向某事。那么问题就变成了代码中adjacency
指向的内容了?
答案是:谁知道?你从来没有把它指向任何东西,所以它随机指向某个地方。当你试图写入一些随机的内存区时会发生什么?好吧,如果你幸运,你会崩溃。
那么,你如何解决这个问题呢?简单:正确初始化和操作adjacency
。您可能希望研究C ++中的动态内存分配和标准库,它提供了一个相当漂亮且有效的链表实现。
旁注:您似乎将adjacency
视为链接列表。但是,您应该注意adjacency
是指向链接列表中节点的指针。再次,现在是了解std::list
的好时机。