0

我有一个带有 Node 对象数组的 C++ 类adj(我猜你不需要查看我的 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并尝试将它存储在 p-th 位置adj

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++ 向量。我很乐意,但这是为了家庭作业。在任何人认为我在作弊之前,请注意,我不是要求解决我指定的特定问题,而是要求我在编译代码时遇到的问题。

4

4 回答 4

7

的类型adj[p++]很明确Node&,您尝试将 a 分配Node*给它。我猜,您的Node类型有一个构造函数采用 anint并且编译器尝试但未能将 the 转换Node*为 an int

您可能打算声明adj

std::vector<Node*> adj;

...然后使用例如添加新节点:

adj.push_back(nod);

(请注意,您仍然需要确保分配的对象在适当的时间点被释放)。

于 2013-07-26T22:04:09.210 回答
2

adj是类型Node*adj[someIndex]然后是类型Node。您正在尝试分配Node*Node. 我有根据的猜测是,你有Node::operator=(int),所以编译器试图以这种方式解释你的代码——但这也不起作用,产生你观察到的错误消息。

于 2013-07-26T22:01:54.180 回答
1

好的,有了这个Node类的定义,我想我可以看到你想要做什么。如果我是正确的,您希望Graph::adj指向一个元素的链接列表,然后Node每个元素都指向列表中的下一个。如果这是正确的,则需要的实现看起来像:NodeNodenew_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;
  }

分享和享受,。

于 2013-07-26T22:27:48.683 回答
1

创建新的后Node

Node *nod = new Node(value);

您需要将其连接到您的链接列表。一个链表看起来像:

[HEAD] => [value|next] => [value|next] => NULL

HEAD在你的情况下会在哪里adj

因此,您需要更新新节点的 next 以指向当前头节点,然后更新头节点以指向新节点。

也就是说,你最终应该得到类似的东西:

adj => [value|next] => [value|next] => ... => NULL
       ^               ^
       nod             adj'

adj'的旧值在哪里adj

它有助于创建数据结构的外观以及如何更新值的图表。

然后,您需要弄清楚如何遍历列表中的节点。

另外,不要忘记清理Graph析构函数中的节点(并小心你如何做到这一点)。

于 2013-07-26T22:33:01.970 回答