1

テールにノードを追加して、リスト{1、2、3、4、5}を作成したいと思います。クライアントの目的で、他のすべてのノードは、テールポインタを使用して最後のノードの後に​​挿入されます。このソリューションの唯一の「問題」は、最初のノードの個別の特殊なケースのコーディングを最適化できることであり、クライアントは私に圧力をかけています。それにもかかわらず、このアプローチは理論的には本番コードにとっては堅実なものでなければなりません...少なくとも、テールに到達したときにnullポインター例外をスローし続けるまでは考えていました...何かが足りないのでしょうか?

struct node* BuildWithSpecialCase() {
    struct node* head = NULL;
    struct node* tail;
    int i;

    Push(&head, 1);
    tail = head;

    for (i=2; i<6; i++) {
        Push(&(tail->next), i); 
    }
    return(head); 
}
4

1 に答える 1

2

すべてのアクセスポインタが先頭から末尾に移動している場合、ノードを末尾に追加すると、リストの「クエリ」が開始された時点では存在しなかった「新しい」データにノードが公開されます。

クライアントと話してください。おそらく、「最適化」以上のものが危機に瀕しています。

---コード編集を見た後に編集---

何が行われているのかを理解してPushいなければ、リンクリストの一番上にあるノードをスタックのようにプッシュしていると思います。

Push(&head, 1);
tail = head;

ここまでは順調ですね。

for (i=2; i<6; i++) {
    Push(&(tail->next), i); 
}

テールでいくつかのノードを編集したようですPushが、リストの最後への参照を維持するためにテールを実際に更新した場所がわかりません。私の読書では、headまだリストの先頭をtail指しており、(割り当てからのtail = head)リストの先頭を指しています。テールを超えた「余分な」ノードがたくさんあります。

それが問題ですか?

于 2012-09-06T14:42:41.617 に答える