我希望这不是一个重复,但我找不到任何类似的职位。
在此基础上的构建可能看起来过于复杂,但我正在尝试学习二叉排序树并将其应用到我的图形知识中。
目前,构建使用两个结构和一个类,一个结构用于Edges,一个用于Vectors,“Graph”类用作二叉搜索树。
// Vertex node stores name and neighbors
struct Vertex {
string name;
vector<Edge *> *neighbors;
};
class Graph {
// Functions like BST and stores a Vertex object with each node
int value;
Graph *left, *right;
struct Vertex *node;
与程序的这一部分交互的函数是我的默认构造函数和参数化构造函数:
Graph::Graph() : value(0), left(NULL), right(NULL), node(){};
Graph::Graph(int data, Vertex* node) {
value = data;
left = right = NULL;
Vertex* newNode = new Vertex;
newNode = node;
};
addVertex
函数:
Graph* Graph::addVertex(Graph* root, string name, int data){
if (!root) {
Vertex* newVertex = new Vertex;
newVertex->name = name;
newVertex->neighbors = new vector<Edge *>();
node = newVertex;
return new Graph(data, node);
}
if (value > root->value){
root->right = addVertex(root->right, name, data);
}
else if (value < root->value){
root->left = addVertex(root->left, name, data);
}
return root;
};
我试着分别删除每个构造函数,尝试在构造函数中创建一个新的顶点。改变类和结构中的变量顺序。看起来程序只是在顶点上创建,并重复覆盖顶点。
我希望发生的是程序会创建一个新的Vertex并存储其名称以供以后比较,但我的输出是这样的:
Vertex name: g Graph Node Value: 3
vertex name: g Neighbors:
Vertex name: g Graph Node Value: 2
vertex name: g Neighbors:
Vertex name: g Graph Node Value: 1
vertex name: g Neighbors:
所以我得到的值是在BST中分配给节点的,但我没有得到存储在顶点中的名称。
1条答案
按热度按时间bjp0bcyl1#
在你的图构造器中,你有:
在局部变量newNode中构造一个新顶点和指向它的指针。
然后将局部变量赋值为指向不同的顶点,即作为参数传入的顶点
然后退出。新构造的顶点保留,但没有任何东西可以引用它。这是内存泄漏。
你的代码还有很多其他的问题(左指针和右指针应该在Vertex类中,而不是Graph类中...),我在这里就不赘述了。
下面是一个完整的应用程序的代码,它可以满足您的需求:
其输出