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 番目の位置に格納しようとするこのメソッドがあり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

1

OK、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

したがって、現在のヘッド ノードを指すように新しいノードの次のノードを更新してから、新しいノードを指すようにヘッド ノードを更新する必要があります。

つまり、次のような結果になるはずです。

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

adj'の古い値ですadj

データ構造がどのように見えるか、および値がどのように更新されているかを示す図を作成するのに役立ちます。

次に、リスト内のノードをトラバースする方法を考える必要があります。

また、デストラクタでノードをクリーンアップすることを忘れないでくださいGraph(その方法には注意してください)。

于 2013-07-26T22:33:01.970 に答える