Q:

リスト処理でサンプルコードに用途不明なコードがある

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

A:

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

