リンクリストは、要素の安易な挿入と削除が必要な場合、および要素がメモリ内で隣接していないことが重要でない場合に使用できます。
これは非常に抽象的であり、配列ではなくリンクリストを使用する理由を具体的に説明したいと思います。私はプログラミングの経験があまりないので、実際の経験はあまりありません。
リンクリストは、要素の安易な挿入と削除が必要な場合、および要素がメモリ内で隣接していないことが重要でない場合に使用できます。
これは非常に抽象的であり、配列ではなくリンクリストを使用する理由を具体的に説明したいと思います。私はプログラミングの経験があまりないので、実際の経験はあまりありません。
回答:
ここに、例と類推の間の一部の方法があります。いくつかの用事があるので、紙をつかんで次のように書きます。
それから、切手も買う必要があることを覚えています。あなたの町の地理のために、あなたは銀行の後にそれをする必要があります。リスト全体を新しい紙にコピーできます。
またはあなたが持っていたものに落書きすることができます:
他の用事について考えたように、リストの一番下にそれらを書くかもしれませんが、矢印でそれを行う順序を思い出させます。これはリンクされたリストです。何かを追加するたびにリスト全体をコピーするよりも速くて簡単です。
次に、銀行にいる間、携帯電話が鳴ります。「ねえ、切手を手に入れました。もう受け取らないでください」。STAMPSをリストから外すだけで、STAMPSなしでまったく新しいものを書き換えることはできません。
これで、実際にコードでお使いのリストを実装できます(お使いの地理に基づいてお使いの順番を並べるアプリかもしれません)。実際にコードでリンクリストを使用する可能性は十分にあります。多数のアイテムを追加および削除する必要がありますが、順序は重要ですが、挿入または削除のたびにリスト全体を再コピーする必要はありません。
C言語の「呼び出しスタック」は、x86(および他のほとんどの)バイナリAPIのリンクリストとして実装されます。
つまり、C言語のプロシージャ呼び出しは、先入れ先出しの原則に従います。(おそらく再帰的な)関数呼び出しを実行した結果は、「呼び出しスタック」、または単に「スタック」と呼ばれることもあります。
CALL
x86命令は、「コールスタック」を使用してリンクリストをimplmenting終わります。CALL
命令%EIPレジスタの内容は、命令のアドレスをプッシュした後のCALL
上にスタックメモリを。呼び出された関数のプロローグは、%EBPレジスタの内容(呼び出し関数のローカル変数の最下位アドレス)をスタックメモリにプッシュします。次に、呼び出された関数プロローグは、%EBPを現在の関数のスタックベースに設定します。
つまり、%EBPは、呼び出し元の関数の%EBP値のアドレスを保持するメモリ位置へのポインタです。これはリンクされたリストにすぎず、を介してハードウェアに部分的に実装されますCALL
。
これが何に役立つかというと、x86 CPUが関数呼び出し、特に関数が独自の引数のコピーと関数のローカル変数を持つ関数呼び出しを実装する方法です。すべての関数呼び出しは、「呼び出しスタック」に情報をプッシュします。これにより、CPUは、呼び出し先関数または呼び出し元関数からの干渉を受けることなく、呼び出し元関数で中断した場所を取得できます。
リンクリストを使用して、メッセージキューを実装できます。
メッセージキューは、後の処理のためにイベントに関する情報を格納する構造です。たとえば、ユーザーがキーを押すかマウスを動かすと、これがイベントになります。アプリケーションは、イベントが発生した瞬間にビジーになる可能性があるため、イベントが発生した正確な瞬間にイベントを処理することは期待できません。そのため、イベントはメッセージキュー(どのキーが押されたか、またはマウスがどこに移動したかに関する情報)に配置され、アプリケーションに余裕がある場合、メッセージキューをチェックし、イベントを取得して処理しますそれら。(これはミリ秒単位の時間枠内で発生するため、目立ちません。)
先ほど説明した使用シナリオから、メッセージキューに格納されているイベントへのランダムアクセスを決して気にしないことは明らかです。メッセージを保存して取得できるようにするだけです。したがって、最適な挿入/削除時間を提供するリンクリストを使用することは理にかなっています。
(メッセージキューが循環配列リストを使用して実装される可能性が高い、またはより可能性が高い、またはほぼ同じであるということを指摘するために突き合わないでください。それは技術的な詳細であり、制限があります:その中の限られた数のメッセージ。)