2017-02-20 3 views
0

私はC++プログラムで以下のリンクリストを持っています。私はそれが適切に構築されたと思います。C++リンクリスト引数 "Node *" incompitable

struct Node 
{ 
    int data; 
    Node* next = NULL; 
}; 
void addNode(Node *head, int data); 

int main() 
{ 
    struct Node 
    { 
     int data; 
     Node* next = NULL; 
    }; 

    Node *head = new Node; 
    head->data = 3; 
    addNode(head, 5); 

    system("pause"); 
    return 0; 
} 


void addNode(Node *head, int data) 
{ 
    Node *curr = head; 
    while (curr->next != NULL) 
    { 
     curr = curr->next; 
    } 
    Node *newnode = new Node; 
    curr->next = newnode; 
} 

まず私は、ノード構造体を作成し、私はheadを作成し、私もちょうどhead->data = 3を設定new Node.に設定します。次に私はNode * headを取り込み、本質的にノードをリンクリストの最後に追加する私のaddNode関数を呼び出します。しかし、私が頭の中を通ると、addNode(head, 5)の文章で、私はエラーが出る'void addNode(Node *,int)': cannot convert argument 1 from 'main::Node *' to 'Node *'

これはなぜですか?それは私には意味がありません。

+3

'main()'の中に 'Node'をもう一度定義するのはなぜですか?これは無関係で、元のものとは関係ありません。 – songyuanyao

+0

プロトタイプを初期化すると、ノードがあるので構造体を再度作成する必要があることがわかりません –

+1

'プロトタイプを初期化する 'とはどういう意味ですか?どのプロトタイプ?あなたが示したコードでは、 'main()'の中の定義を削除するだけで問題ありません。 – songyuanyao

答えて

1

これは単なる一般的な範囲の問題です。 addNode関数内で使用されているstruct Nodeは、main()の前に宣言されたものです。しかし、main関数内のコードは、mainの範囲内で再定義されたstruct Nodeを使用しています。したがって、cannot convert main::Node* to Node*というエラーです。

mainの内部からstruct Nodeの定義を削除すると動作します。

また、addNode関数内では、新しいNodeのデータ値を設定していないので、それも必ず行ってください。

0

ただ、次を削除します。

struct Node 
{ 
    int data; 
    Node* next = NULL; 
}; 

あなたの問題はあなたが別のスコープを持つ別のタイプを定義しているということです。コンパイラは第1の定義をglobal::Nodeに似ていると考えていますが、第2の定義はmain::Nodeです。

実際に、headに値を代入すると、互換性のない型(global::Node* = main::Node*)が割り当てられているため、コンパイラはエラーをスローします。

+0

ありがとうございます。また、私には質問があります。 'Node * head = new Node;と' Node * head = new Node(); 'の違いは何ですか?それらはどちらもうまくいくようです –

+0

括弧はデータ型の初期化関数、つまり 'constructor'を呼び出します。 http://en.cppreference.com/w/cpp/language/initialization 可能な限り、常に変数を初期化する必要があります。そうしないと、未定義の動作が発生する可能性があります。詳細な説明については、 https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization –

+0

をチェックしてください。このコメントに例を追加します。 'struct Foo {int bar;};'があり、宣言すると 'foo.bar'を' 0'に設定する初期化子があります。 'x = new Foo'を呼び出すと' x-> bar'の値が未定義に設定され、 'x = new Foo()'を呼び出すと毎回 'x-> bar'が' 0'に設定されます。 –

関連する問題