>> strcpy() の次の p->next = NULL; が冗長でした。
> p->next = NULL; があっても正しい動作をしたのですが?
> あった場合はなぜいけないのでしょうか?
冗長というのは、あってもいいけど、無駄だということです。
(1) 最初の if 文で return するとき
p->next = NULL;
p->next = head;
(2) for 文で、break するとき、
p->next = NULL;
p->next = cur;
(3) for 文で、break しないとき、
p->next = NULL;
(1)と(2)は冗長ですよね。書き直したほうでは、p->next への代入は一回です。
> for (prev = cur = head; (cur = cur->next) != NULL; prev = cur)
> if (strcmp(name, cur->name) < 0) break;
>
> ここの、for文の最後のprev = curのところが、トレースしてみたのですが
> わからなかったのですが。
この for ループは、次のように書いたほうが分かりやすかったかもしれません。 prev = head, cur = head->next;
for ( ; cur != NULL; prev = cur, cur = cur->next)
if (strcmp(name, cur->name) < 0) break;
cur で、リストの要素を次々と見ていくのですが、p の指す新しい要素を挿入する
場所が見つかったとき、その cur の前に挿入するには、一つ前の要素へのポインタ
が必要です。それが prev なのです。図を描いてたどってみてください。
もしも、ひとつのポインタでループを回りたければ、次のようにすれば出来ます。
for (prev = head; prev->next != NULL; prev = prev->next)
if (strcmp(name, prev->next->name) < 0) break;
p->next = prev->next;
prev->next = p;
return head;
余談ですが、if (strcmp(name, cur>name) <= 0) break; としたほうが、早く
ループを抜ける可能性があります。
|