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

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

ただいまの
回答率

90.75%

  • C

    3445questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 159

sanchu52

score 130

以下のプログラムで一番下の 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;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asm

    2017/11/18 21:42 編集

    前回の質問(https://teratail.com/questions/101042 )と、何が違うのかがわかりません

    キャンセル

  • sanchu52

    2017/11/18 22:22

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

    キャンセル

回答 2

checkベストアンサー

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 22:32

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

    キャンセル

  • 2017/11/18 22:37

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

    キャンセル

  • 2017/11/19 07:55

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/18 22:29

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

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    スタックの応用

    スタックを利用して入力された文字列の回文を作るプログラムを作成したら、出力されません。 例えば、「abcd」と入力したら、「abcddcba」と主著力される。 発生して

  • 解決済

    オーバーフローします...

    前提・実現したいこと アルファベット順に表示したいです どうやったらアルファベット順に表示できますか? もし,このままでいいならオーバーフローを直して欲しいです... アル

  • 解決済

    fgetsを使った文字列の分割

    前提・実現したいこと AOJ 1_5Aの問題で、よくないとされるscanf以外を使用した解決を図りたいです。 問題内容は、 トランプの枚数が足りないので現在持っているカードを入

  • 解決済

    char型の配列変数にchar型の変数を代入したい

    使用言語 C 環境 Visual Studio 2017 初めての質問です。 独学でプログラミングを始めたのですがわからないところがあり困っています。 char型の配列変数の使い方

  • 受付中

    プログラムを見やすく改良したい

    正常に動くプルグラムを見やすく改良したい。 具体的に教えていただければありがたいです。セグメンテーションフォルトでベスト7まで表示して停止します。173行あたりだと思うのですが、よ

  • 解決済

    c言語 リスト構造について...

    前提・実現したいこと 最近C言語でリスト構造を勉強したので自己流でリスト構造のプログラムを作成したのですが正常に作動しません。どなたか解決法を教えてください。 説明不足だったの

  • 受付中

    リスト構造と待ち行列

    リスト構造と待ち行列をしたいのですが、よくわかりません。 おすすめのサイトや説明おねがいします。 #include <stdio.h> #include <stdlib.h>

  • 受付中

    C言語 リスト 新しいノードをリストの最後に追加

    C言語 リストについて ↓のプログラムでは入力した数字を逆順に表示 /* list.c */ #include <stdio.h> #include <stdlib.h> st

同じタグがついた質問を見る

  • C

    3445questions

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