我有一个C ++类,其中包含一个名为adj
的Node对象数组(我想你不需要看到我的Node类的实现)
class Graph {
public:
Node *adj;
bool *marked;
int nVertex, p;
int *distance;
void graph(int quantity);
bool is_marked();
void cleaner();
void newVertex(int value);
};
我有这个创建节点nod
并尝试将其存储在adj
中的第p个位置的方法:
void Graph::newVertex(int value)
{
Node *nod = new Node(value);
adj[p++] = nod;
}
当我尝试编译此代码时,我收到以下错误消息:
invalid conversion from 'Node*' to 'int'
我无法在代码中看到我做错了什么。数组初始化看起来对我和对象赋值也是正确的。请帮我回答这个问题。
更新:Node
类的代码:
class Node {
public:
int value, cost;
Node *next;
Node() {}
Node(int val) {
value = val;
next = NULL;
cost = 0;
}
};
更新:我不能在这里使用C ++ vector。我很乐意,但这是为了做作业。在有人认为我在作弊之前,请注意我并不是要求解决我的具体指定问题,而是要解决我编写代码时出现的问题。
答案 0 :(得分:6)
adj[p++]
的类型显然是Node&
,您尝试为其分配Node*
。我猜,您的Node
类型的构造函数采用int
并且编译器尝试但未能将Node*
转换为int
。
您可能打算将adj
声明为
std::vector<Node*> adj;
...然后使用例如:
添加新节点adj.push_back(nod);
(注意,你仍然需要确保在适当的时间点释放分配的对象。)
答案 1 :(得分:2)
adj
的类型为Node*
。 adj[someIndex]
的类型为Node
。您正尝试将Node*
分配给Node
。我的有根据的猜测是,你有Node::operator=(int)
,所以编译器试图以这种方式解释你的代码 - 但这也不成功,产生你观察到的错误信息。
答案 2 :(得分:1)
好的,手头上有Node
课程的定义,我想我可以看到你想要做的事情。如果我是正确的,您希望Graph::adj
指向Node
个元素的链接列表,每个Node
然后指向列表中的下一个Node
。如果这是正确的,new_vertex
的实现需要看起来像:
void Graph::newVertex(int value)
{
Node *nod = new Node(value);
nod->next = adj;
adj = nod;
}
无需索引(p
) - 您只需使用类似于
Node
元素的链接列表
Node *n = adj;
while(n != NULL)
{
// do something useful with n
n = n->next;
}
如果你真的坚持使用数组语法来访问链表的元素(在我看来是个坏主意,因为它只会增加潜在的混淆,但是YMMV)你可以添加像
这样的东西Node *operator[](int n); // 0-based index into Node list
到Graph
,其实现类似于
Node *operator[](int ndx)
{
Node *n = adj;
for( ; n != NULL, ndx > 0 ; ndx--)
n = n->next;
return n;
}
分享并享受,。
答案 3 :(得分:1)
创建新Node
后:
Node *nod = new Node(value);
您需要将其连接到链接列表。链表如下:
[HEAD] => [value|next] => [value|next] => NULL
您的案例中HEAD
为adj
。
因此,您需要更新新节点的下一个节点以指向当前头节点,然后更新头节点以指向新节点。
也就是说,你应该得到类似的东西:
adj => [value|next] => [value|next] => ... => NULL
^ ^
nod adj'
其中adj'
是adj
的旧值。
它有助于创建数据结构外观以及值如何更新的图表。
然后,您需要确定如何遍历列表中的节点。
另外,不要忘记清理Graph
析构函数中的节点(并注意如何执行此操作)。