「Circular Linked List」(単一または二重)データ構造が正確に必要なのはなぜですか?
単純なリンクリスト(1つまたは2つ)で明らかな、どのような問題を解決しますか?
簡単な例は、マルチプレイヤーボードゲームでの順番を追跡することです。すべてのプレーヤーを循環リンクリストに入れます。プレーヤーが順番を回したら、リスト内の次のプレーヤーに進みます。これにより、プログラムはプレーヤー間で無期限に循環します。
循環リンクリストをトラバースするには、表示される最初の要素へのポインターを保存します。その要素が再び表示されたら、リスト全体をトラバースしました。
void traverse(CircularList *c) {
CircularList start = c;
do {
operateOnNode(c);
c = c->next;
} while(c != start);
}
それらを使用する2つの理由:
1)一部の問題領域は本質的に循環的です。
たとえば、モノポリーボード上の正方形は、固有の構造にマッピングするために、循環リンクリストで表すことができます。
2)一部のソリューションは、効率化のために循環リンクリストにマッピングできます。
たとえば、ジッタバッファは、ネットワークから番号の付いたパケットを取得して順番に並べるバッファの一種で、ビデオまたはオーディオプレーヤーが順番に再生できるようにします。遅すぎる(遅れている)パケットは破棄されます。
これは、スロットが再生されると再利用できるため、メモリを常に割り当てたり割り当て解除したりすることなく、循環バッファで表すことができます。
couldリンクリストで実装されますが、定数への置き換え(より安価)ではなく、リストへの追加と削除が常に行われます。
用途
1)循環リンクリストは、エントリが順番に表示される任意のアプリケーションを使用できます。
2)循環リンクリストは、ラウンドロビンスケジューリングアルゴリズムの基本的な考え方です。
グーグルから見つけたもの。
単一リンクの循環リストは、リストの最後のノードがリストの最初のノードを指すリンクリストです。循環リストには、NULLポインターは含まれません。
循環リンクリストを使用するアプリケーションの良い例は、オペレーティングシステムによって解決されるタイムシェアリングの問題です。
タイムシェアリング環境では、オペレーティングシステムは現在のユーザーのリストを維持し、各ユーザーが一度に1ユーザーずつ、CPU時間の小さなスライスを使用できるようにする必要があります。オペレーティングシステムはユーザーを選択し、ユーザーに少量のCPU時間を使用させてから、次のユーザーに移動します。
このアプリケーションでは、CPU時間を要求する人がまったくいない場合を除き、NULLポインターはありません。
循環リンクリストを効果的に使用して、キュー(FIFO)または両端キュー(前面および背面からの効率的な挿入および削除)を作成できます。 http://en.wikipedia.org/wiki/Linked_list#Circularly-linked_vs._linearly-linked を参照してください
循環リンクリストを使用するアプリケーションの良い例は、オペレーティングシステムによって解決されるタイムシェアリングの問題です。
循環リンクリストは、タスクを繰り返すアプリケーションやタイムシェアリングアプリケーションで広く使用されています。循環キューは、実行されたタスクと実行されなければならないタスクを追跡し、特定のタスクが完了すると次のタスクにジャンプし、タスクのセット全体が完了すると、最初のタスクに再びジャンプして残りのジョブを完了します。実際の使用:システムで複数のアプリケーションを開くと、それらのアプリケーションのメモリは循環的に保存されます。アプリケーションを切り替えるためにwin + tab/alt + tabを連続して押すと、これを観察できます。また、マルチプレイヤーボードゲームでは、各プレイヤーがリンクリストのノードに割り当てられ、ローテーションが実行されます
リソースプールで循環リンクリストを使用できます。多くのユーザーが共有リソースを使用する場合、循環リンクリストを使用してそのリソースを割り当てることができます。
循環リストは、通常の二重リンクリストよりも簡単です。 Appendはちょうどprependで、1回前方にシフトしますポップバックは1回だけシフトバックし、ポップフロントです。両端を結び付けることにより、片端リストの操作を実装するだけのコストで両端リストが得られます。
循環リンクリスト(1回または2回)は、各ノードに均等にアクセスする必要があるアプリケーションに役立ちますおよびリストが大きくなる可能性があります。リストのサイズが固定されている場合、循環キューを使用する方がはるかに効率的です(速度とメモリ)。