連結リストの操作について学んでいるので、構造体を以下のように定義しました。
C
1// CELL 型の構造体の定義 2typedef struct _cell { 3 int data; // データ部 4 struct _cell *next; // ポインタ部 5} CELL; 6CELL *head; // head:先頭セルへのポインタ
ここでheadにはNULLが入っているようなので先頭セルへデータdを挿入する以下の関数を作成しました。
C
1void insert_cell_top(int d){ 2 CELL *new_cell; 3 new_cell = (CELL *)malloc(sizeof(CELL)); // 新しいセルnew_cell の作成 4 new_cell->data = d; // new_cell のデータ部= d 5 if(head == NULL) { // 連結リストが空の時 6 new_cell->next = NULL; // 末尾をNULLで定義 7 head = new_cell; // new_cellを先頭セルへ 8 }else{ 9 new_cell->next = head; // new_cell のポインタ部= head が指すセルのポインタ部 10 head = new_cell; // new_cellを先頭セルへ 11 } 12}
連結リストの末尾のセルのポインタはNULLとすると都合がよいそうなのですが、新しいセルを作成したときそのセルのポインタ部にはランダム値が入っているようで、わざわざnew_cell->next = NULL;
をする必要がありました。
headとセルの->nextは同じポインタなのに、どうしてheadの初期値はNULLで、セルの->nextはランダムになっているのでしょうか?教えていただきたいです。
質問を追加させてください。
グローバル変数は0で初期化されるのは分かりました。ただ、グローバルで定義したheadはNULLを指しているのですよね。それであればで先頭セルへの挿入は場合分けしなくてもnew_cell->next = head
とすることで、new_cell->next = NULL
にはなるのではないかと考えましたが、実際ダメみたいでした。場合分けして、わざわざnew_cell->next = NULL;
とする必要がある理由説明していただきたいです。
以下の先頭セルの挿入する関数を以下のようにしたとき、動かずに質問していたのですが、今はなぜか場合分けせずとも動くようになっていました。この関数以外の他の場所が間違えていて動いていなかったかもしれません。
C
1void insert_cell_top(int d){ 2 CELL *new_cell; 3 new_cell = (CELL *)malloc(sizeof(CELL)); // 新しいセルnew_cell の作成 4 new_cell->data = d; // new_cell のデータ部= d 5 new_cell->next = head; // new_cell のポインタ部= head が指すセルのポインタ部 6 head = new_cell; // new_cellを先頭セルへ 7}
解答してくれた方々、ありがとうございました。
回答2件
あなたの回答
tips
プレビュー