44108


リスト処理で下のプログラムのコメント部分の「//最後のデータを探す」というコードの意味がわかりませんprintfでどこで使われてるか検証しましたがわかりません。
そもそも意味があるコードなのかもわかりません、自分的には意味ないコードだと思ってますがどうなのか知りたいです

[code]

    #include "stdio.h"
    #include "conio.h"
    #include "string.h"
    #include "stdlib.h"
    
    #define NAMELEN 16
    
    struct list {
    
        char name[NAMELEN];
        int price;
        struct list *next;
    
    };
    
    struct list *start = NULL;
    
    int main() {
    
        struct list *p = NULL, *dt, *t;
        int n;
        char name[NAMELEN] = { '\0' };
    
    do {
            do {
                printf("データの追加・削除[Add...0 / Delete... 9]:");
                scanf_s("%d", &n);
                if (n != 0 && n != 9) {
                    printf("0もしくは9を入力してください\n");
                }
            } while (n != 0 && n != 9);
    
            /*追加*/
            if (n == 0) {
                dt = (struct list *)malloc(sizeof(struct list));
                dt->next = NULL;
                printf("名前:"); scanf_s("%s",dt->name,NAMELEN);
                printf("値段:"); scanf_s("%d", &dt->price);
                if (start == NULL) {
                    start = dt;
                    p = dt;
                }
                else {
                    p->next = dt;
                    p = dt;
                }
            }
    
    
            /*削除*/
            if (n == 9) {
    
                if (start == NULL) {
                    printf("データがありません\n");
                }
                else {
                    p = NULL;/*dtの一つ前のデータのポインタを入れる*/
                    printf("名前:"); scanf_s("%s",name,NAMELEN);
                    dt = start;
                    do {
                        if (strcmp(name, dt->name) == 0) {//同じ
                            if (p == NULL) {//先頭のデータと同じだった時の削除
                                printf("p\n");//確認
                                start = dt->next;
                            }
                            else {
                                p->next = dt->next;
                                free(dt);
                                dt = NULL;
                            }
    
                            break;
                        }
                        else {
                            p = dt;
                            dt = dt->next;
                        }
                    } while (dt != NULL);
    
                    //最後のデータを探す
                    p = start;
                    if (p == NULL) {
                    }
                    else {
    
                        do {
    
                            if (p->next != NULL) {
                                printf("最後のデータを探す\n");
    
                                p = p->next;
                            }
                            else {
                                break;
                            }
    
                        } while (p != NULL);
                    }
    
                }
    
            }
    
        /*表示*/
        t = start;
        if (t != NULL) {
            n = 1;
            do {
                printf("No.%d: 名前 %s  値段 %d\n", n, t->name, t->price);
                t = t->next;
                n++;
                } while (t != NULL);
            }
            else {
            printf("データはありません");
            }
    
        do {
            printf("もう一度？　[YES・・・0 / NO・・・9]:");
            scanf_s("%d",&n);
            if (n != 0 && n != 9) {
                printf("0もしくは9を入力してください\n");
                }
            } while (n != 0 && n != 9);
    
    
    } while (n != 9);
    
    
    
    
        _getch();
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2018-05-20T12:15:29.207
44106
2018-05-20T13:35:10.230
2018-05-20T13:35:10.230
76
question
c
リスト処理でサンプルコードに用途不明なコードがある


意味はあります。

このコードでは、`start`がリストの先頭の要素を指し、`p`が最後の要素を指すようになっています。こうすることで新しい要素を追加するときに、リスト全体を走査することなしに、`p`だけ見て追加することができます。

一方、要素を削除するときには、削除する要素を探すため、`p`をリストを走査する目的に使っています。このため、削除した後に`p`が一番最後の要素を指しているとは限りません。このままでは、次に要素を追加することに問題が起きてしまいます。そこでもう一度`p`を最後の要素を指すようにするのが、該当のコード部分です。


CC BY-SA 4.0
2018-05-20T13:14:54.123
44108
2018-05-20T13:14:54.123
3605
44106
answer


データを追加する際、`p` がリストの末尾を指していることを前提に、`p` の次へ追加しています。

従って、データを削除した際には、`p` がちゃんと末尾を指すようにしておかないと、次に追加する時におかしなことになります。


CC BY-SA 4.0
2018-05-20T13:31:04.447
44109
2018-05-20T13:31:04.447
5288
44106
answer