dポイントプレゼントキャンペーン実施中!

リストの末尾にデータを追加すると、最後に追加したデータで今までのリストのデータが上書きされてしまいます。。
以下に、ソースを掲載させていただきます。

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したつもりなのですが、どうもそうではないようで、困っています。
どうか、御指導の程、お願いします。

A 回答 (4件)

1.実体を作る


2.追加するアドレスを探す
3.1で作った実体を2で探した場所に入れる

1と2を同時にやろうとするから混乱するんじゃないかな…?

calloc/mallocをするときは、NULLだったらエラー処理するようにしませウ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/01/23 22:54

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2006/01/23 22:57

 原因は、すべてのノードのデータフィールドが最終的にひとつのmemというポインタに依存してしまっているからでしょう。

ですから、一番最後に入力した値が、すべてのノードが参照する唯一の値になってしまっているようです。
 データフィールドがポインタでなければならない何か特別な理由があるのでなければ、これを単純なint型のフィールドにすればいいのでは。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/01/23 22:53

すいません


Node と
List について補足して下さい。

とりあえずは、
main の中で定義されている
Node* root;
ですが、実体を指していないように思われるのに
root->board = mem;
のように使われているように思いますが・・
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/01/23 22:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!