テール補間を使用して二重リンクリストを作成する方法
実際、もともとはWangチームから提供されたリンクリストのクイックリストを完成させたかったのですが、二重リンクリストの作成が完了した後は12時だったので、明日早くQAQに立ち上がる必要がありました。
1つは、なぜ二重リンクリストがあるのですか。
私はそれ一本鎖についてお話しましょう
限り、単一のリスト
彼のノード構造の1つは
[要素フィールド|次のポインターフィールド]
後挿入メソッドを使用して単一リンクリストを確立するたびに、前のノードのポインターフィールドは、上の図の最初のノードなどの次のノードを指します(e1要素が配置されているノード、青色の網掛けのノードはヘッドノード)ポインターフィールドが次のノードを指す
など
単一のリンクリストと呼ばれる、ポインターによってリンクされたリンクリストを取得できます。
要素が配置されているノードのポインターフィールドがある場合、要素が配置されているノードの周りにノードを簡単に挿入できることがわかります
しかし!!!この要素の前の要素の前に補間したい場合は、テーブルを最初からもう一度トラバースする必要があります。これは時間の浪費です(つまり、1行で運転している間は方向転換できません)。
そこで二重リンクリストを導入しました
第二に、二重にリンクされたリストの確立
ダブルリンクリストの長さは以下の通りです
彼のノード構造の1つは
[前のポインタフィールド|要素フィールド|次のポインタフィールド]
二重リンクリストには、上記の単一リンクリストよりも1つ多い「優先ポインタフィールド」があります。前は前のノードを指す針であり、次は上記の単一リンクリストと同じで、後ろのノードポインタを指す
上記の質問に戻る
要素の前に要素を事前に挿入する必要がある場合、二重リンクリストを使用する方がはるかに高速になります。
テーブル全体を最初から全探索する必要がないため、二重リンクリストの各ノードに格納されている前のノードのアドレス
ポインタを前に動かすだけで完了します(1本の線が2本の破線になります!いつでも向きを変えることができます)
二重リンクリストを作成する手順は次のとおりです
1.二重リンクリストのノードタイプの定義
1 typedef struct DNode { 2 int data; 3 struct DNode * prior、* next; 4 } DNode、* DLinkList;
要素フィールドが定義され(私がここで使用するint型、これは置き換えることができます)、2つのポインターフィールド* previousと* nextがそれぞれ、ノードの前のノードと次のノードを指すために使用されます
2.二重にリンクされたリストの確立
1 DLinkList DList_Create(DLinkList&D) 2 { 3 int num; 4 scanf(" %d "、&num); 5 D =(DNode *)malloc(sizeof(DNode)); // ヘッドノードを定義 6 DNode * S、* P = D; // Sは、挿入するノードへのポインタである 7。 P->次に= NULL; 8。 しばらく - (NUM =!1。 )// 入力ストップ-1 9。 { 10 S =(DNode *)malloc(sizeof(DNode));// 挿入するsにスペースを適用します 11 s-> data = num; 12 s-> next = p-> next; // s nextは前のノードの次のフィールドをコピーしますp 13 p-> next = s; // 前のノードpの次のポイントはs 14を指します s-> previous = p; // sの優先度は前のノードpを指しますp 15 p = p-> next; // ポインターは後方に 16 scanf(" %d "、&num); // 次の要素の値 17 } 18 return D; 19 }
その間の手順は次のとおりです
s =(DNode *)malloc(sizeof(DNode)); // 挿入するsにスペースを適用します
s-> next = p-> next; // sの次のフィールドは、前のノードpの次のフィールドをコピーします
p-> next = s; // 前のノードの次のポイントpはsを指す
s-> previous = p; // sの優先度は前のノードpを指します
p = p-> next; // pポインタは1ビット戻ります
今は1.22です。もう寝ないと突然死んでしまいます。
へへ