質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

Q&A

解決済

1回答

2285閲覧

連結リストの先頭要素の削除の仕方

qpringo

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

0グッド

0クリップ

投稿2020/08/01 13:22

編集2020/08/01 14:17

連結リストの先頭要素の削除の仕方の質問です。

c

1struct LIST{ 2 int data; 3 struct LIST *next; 4}; 5 6int main() { 7 struct LIST *head, *new_r, *tail; 8 scanf("%d", &x); 9 new_r=(struct LIST *) malloc(sizeof(struct LIST)); 10 new_r->data = x; 11 new_r->next = NULL: head = new_r; tail = new_r; 12 while(scanf("%d", &x)){ 13 new_r=(struct LIST *) malloc(sizeof(struct LIST)); 14 new_r->data=x; 15 tail->next=new_r; new_r->next=NULL; tail=new_r; 16 } 17}

このような構造のとき、先頭の要素をとりだして削除するには

data = head -> data; head = (head -> next) -> next;

とすればよいとあるのですが、この書き方だとheadの位置が先頭から2番目の要素(headの次ではない)を指し示すように思えてしまいます。head = head -> nextにならない理由は何でしょうか?

細かい文法や、例外性などについては無視していただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/08/01 14:39

それはどこに書いてあることなんでしょうか
y_waiwai

2020/08/01 14:45

その本の解説にはどう書いてありますか?
qpringo

2020/08/01 14:49

どう というのが私にはわからないのですが、質問文と原文に大きな違いはありません。 削除すると言いながら領域を解放していないといった部分は特に気にしていません。個人的に気になるのはheadの再指定が誤植なのではないだろうかという点です
guest

回答1

0

ベストアンサー

疑問が生じたならやってみればいいのであって:

C

1#include <stdio.h> 2 3struct LIST{ 4 int data; 5 struct LIST *next; 6}; 7 8int main(){ 9 struct LIST L0, L1, L2; 10 int data; 11 struct LIST* head; 12 L0.data = 0; L0.next = &L1; 13 L1.data = 1; L1.next = &L2; 14 L2.data = 2; L2.next = NULL; 15 16 head = &L0; 17 18 // 削除前 19 { struct LIST* p = head; 20 printf("before\n"); 21 while ( p ) { printf("%d ", p->data); p = p->next; } 22 printf("\n"); } 23 24 data = head->data; 25 head = (head->next)->next; 26 27 // 削除後 28 { struct LIST* p = head; 29 printf("after\n"); 30 while ( p ) { printf("%d ", p->data); p = p->next; } 31 printf("\n"); } 32 33 return 0; 34}

実行結果:

before 0 1 2 after 2

...うん、オカシイね。

投稿2020/08/01 15:40

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qpringo

2020/08/01 15:54

ありがとうございます。自分の環境でもおかしいことを確認していましたが、どうしても教科書がこういった間違いをするとは思えず、どうしても第三者の考えがほしかったのです。安心できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問