• ベストアンサー

list構造。。。

リストの末尾にデータを追加すると、最後に追加したデータで今までのリストのデータが上書きされてしまいます。。 以下に、ソースを掲載させていただきます。 void SetNode(List* node_first, List* node_second, int *data) { node_first->move = data; node_first->next = node_second; return ; } /*末尾に挿入*/ void Insert_Tail(List **head, int* data) { List *ptr = *head; if(ptr == NULL){ *head = (List*)calloc(1,sizeof(List)); SetNode(*head, NULL, data); return ; }else{ while(ptr->next != NULL){ ptr = ptr->next; } ptr->next = (List*)calloc(1,sizeof(List)); SetNode(ptr->next, NULL, data); } return ; } void show_list(List *list) { List *ptr = list; while(ptr != NULL){ printf("%d\n",*(ptr->move)); ptr = ptr->next; } return ; } int main(int argc, char** argv) { /*宣言*/ Node* root; /**/ List* top; /* 手順のリスト */ int judge; top = NULL; do{ printf("num:"); scanf("%d",&judge); switch(judge){ case 1: /*データを末尾に追加*/ printf("mem:"); scanf("%d",mem); root->board = mem; Insert_Tail(&top, root->board); break; case 2: /*リストを頭から表示*/ show_list(top); break; default: break; } }while(judge != 0); return 0; } 自分は最後のリストまでたどって、callocしたつもりなのですが、どうもそうではないようで、困っています。 どうか、御指導の程、お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

1.実体を作る 2.追加するアドレスを探す 3.1で作った実体を2で探した場所に入れる 1と2を同時にやろうとするから混乱するんじゃないかな…? calloc/mallocをするときは、NULLだったらエラー処理するようにしませウ。

damedamekun
質問者

お礼

今後、関数の先でcallocして、そいつを戻すときには、その3つに気をつけて作成します。 ありがとうございます。

その他の回答 (3)

回答No.4

ポインタを勉強しましょう

damedamekun
質問者

お礼

よく勉強します。 ありがとうございます。

  • bobviv
  • ベストアンサー率50% (13/26)
回答No.3

 原因は、すべてのノードのデータフィールドが最終的にひとつのmemというポインタに依存してしまっているからでしょう。ですから、一番最後に入力した値が、すべてのノードが参照する唯一の値になってしまっているようです。  データフィールドがポインタでなければならない何か特別な理由があるのでなければ、これを単純なint型のフィールドにすればいいのでは。

damedamekun
質問者

お礼

ありがとうございます。 メモリマップを書いて、苦労の末、完成させることが出来ました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

すいません Node と List について補足して下さい。 とりあえずは、 main の中で定義されている Node* root; ですが、実体を指していないように思われるのに root->board = mem; のように使われているように思いますが・・

damedamekun
質問者

お礼

テストプログラムの状態で書き込んでしまい、混乱させてしまって申し訳ありません。

関連するQ&A