2016-11-27 11 views
-1

現在、ポインタや構造体について学習中ですが、私は練習に取り組んでいます。 私の目標は、基本的に新しいリスト要素を作成し、それを前面に追加する関数head_insertを書くことです。C++でリストを作成する

注:データ型リストは既にC++にありますが、これは動的構造の背後にあるコンセプトをよりよく理解して理解するためのものです。

私のコードは次のようである:

struct list{ 
    int val; 
    list *next = NULL; 
}; 

typedef list* ptr_list; 

ptr_list head_insert(ptr_list head, const int element){ 
    ptr_list tmp_head; 
    tmp_head = new list; 
    tmp_head->val = element; 
    tmp_head->next = head; 
    return tmp_head; 
} 

int main(){ 
    ptr_list head = NULL; 
    head = head_insert(head, 1); // This is the crucial step I think, as head is not initialized yet 
    head = head_insert(head, 2); 

    return 0; 
} 

事は、すなわち私のリストが空である、頭がNULLのとき、私は仕事にも機能head_insertをしたい、です。しかし、自分のコードをデバッグすると、head_insertの各呼び出しがNULLのままであることに気付きましたが、head内の変更(head-> val、head-> next)が行われます。

なぜですか?それはtmp_headの範囲と関係がありますか? 私の意図したとおりに動作するようにコードを修正する方法はありますか?

私が最初にNULLに頭を設定しますが、スペースを割り当て、最初の要素を手動で設定していけない場合は、すべてが完璧に正常に動作します:あなたの時間を

head = new list; 
head->val = 1; 

感謝をし、助けて! いいえ

+3

問題は表示されません。 '頭部 'が変化しているようだ。http://coliru.stacked-crooked.com/a/baf503d3389a8cac –

+1

コードは正常に見える。たぶんあなたはデバッガにいくつかの問題があります。 – arturx64

答えて

1

head_insertが呼び出された後、コードが正常に表示され、headが確実に変更されます。しかし

、あなたは、頭の中

変化(頭部>ヴァル、頭部>次)が

が間違って作られて、あなたはhead_insertから頭を "変更" していないと言って新しいオブジェクトtmp_headを作成し、後でhead_insertが返されたときにheadに割り当てられます。

デバッガを使用していたときには、headNULLhead_insert)以内に実行されていることに気づいたでしょう。これは絶対に正常です。その後、関数が返されたときには、がhead = head_insert(head, 1);のようにheadにコピーされ、headNULLからNULLに変更されます。

+0

あなたの答えをありがとう。それは変です。 Eclipseデバッガーは、全時間がhead = 0x0であることを示しています。しかし、あなたが正しいのですが、head_insertを1回呼び出すたびにヘッドを印刷すると、その値が実際に変化していることがわかります。 私は自分のコードのデバッグにつながる元々の問題を解決しました。最初はポインタをNULLに設定していました。私は初めにそれをやりませんでしたし、プログラムは挿入の後に終了し、リストの作業に失敗しました。 – Doc

関連する問題