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

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

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

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

Q&A

解決済

2回答

1770閲覧

リストでwhile (1)でa = a->nextlist;が1つ前のアドレスを指すのがわかりません。

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

1クリップ

投稿2017/11/18 12:28

以下のプログラムで一番下の while (1)でa = a->nextlist;が1つ前のアドレスを指すのがわかりません。教えてください。

コード #include <stdio.h> #include <stdlib.h> #include <string.h> struct list { int num_data; struct list *nextlist; }; int main() { struct list *a; struct list *b; char str[16]; b = NULL; printf("整数を入力(Eで終了)-->"); scanf("%s", str); //最初に整数を1個入力します。 while(1){ if(strcmp(str, "E") != 0) //strcmpは文字列の比較, //すると最初のwhileループの中で //入力されたものが「E」でないために(13としたもの) a = (struct list *)malloc(sizeof(struct list)); //list型構造体の大きさ分だけ 動的にメモリが確保されます。 //このアドレスがポインタaに代入されます。 else break; a->num_data = atoi(str);//atoiは文字列をint型に変換する //入力されたデータを構造体メンバに代入します。 a->nextlist = b; //nextlistメンバにb(NULL)を代入します。 //最初の構造体の nextlistメンバにはNULLが入っています b = a; //確保したメモリ領域の先頭アドレスをbに代入する。 printf("整数を入力(Eで終了)-->");//新しいデータを メンバに代入します scanf("%s", str); //新しいデータを メンバに代入します } printf("入力された整数は"); a = b; //aには最後の代入を行った構造体のアドレスが 入ります。 while (1) { if (a == NULL) break; printf("%d, ", a->num_data); a = a->nextlist; } return 0; }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/11/18 13:22

すみません。おなじですね。まだまだ理解不足ですね。Takahito_Ogawaさんの説明をよく読んでみます。皆さんおせわになります。
guest

回答2

0

ベストアンサー

while (1) { if (a == NULL) break; printf("%d, ", a->num_data); a = a->nextlist; }

a = a->nextlist;はイメージ的には、for文で、i = i + 1ってインデックスを辿っていってるのと考え方は同じですよ。要は、aのリンクを次々手繰り寄せていってるような感じです。

投稿2017/11/18 13:05

Takahito_Ogawa

総合スコア229

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

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

退会済みユーザー

退会済みユーザー

2017/11/18 13:32

i=i-1ってインデックスを辿っていってるのですか。さっきの説明を読み直します。
Takahito_Ogawa

2017/11/18 13:37

前回の質問の回答を用いて説明すると、左向きにリンクを貼っていたのを思い出してください。最終的にheadやpは一番右端にいるのですから、リンクの向き通りにたどっていくと右から左に辿っていくことになりますよね?言い方を替えると左向きにリンクを貼るといっていたのが、1つ前のノードを指すことに相当します。
退会済みユーザー

退会済みユーザー

2017/11/18 22:55

ありがとうございます。がんばります。集めたリンクのプログラムをよんでいます。読み進めていけば理解が深まると思います。これは住所録を作るためにやっています。
guest

0

その前にa->nextlist = b;で、nextlistに一つ前のstructのアドレスを入れているからです。

投稿2017/11/18 12:50

otn

総合スコア84423

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

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

退会済みユーザー

退会済みユーザー

2017/11/18 13:29

a->nextlist = b;でaをheadにするために1つ前のstructのアドレスを入れているからですか。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問