あなたの説明から、1000 個のノードの配列がすべてゼロになっています。議論のために、その配列の名前node_array
は 、リンク フィールドの名前はnext
です。head
また、ノードの 1 つを指すことができるというポインターもあります。
1000 個の整数の配列を割り当てることができます。
enum { NUM_ITEMS = 1000 };
int mapper[NUM_ITEMS];
リストを初期化して、各番号が 1 回表示されるようにすることができます。
for (int i = 0; i < NUM_ITEMS; i++)
mapper[i] = i;
リストをシャッフルできます。(実際には、Knuth (The Art of Computer Programming) または Bentley (Programming Pearls または More Programming Pearls) を確認する必要がありますが、ランダム シャッフルの正しいアルゴリズムには別の乱数ジェネレーターが必要だと思います。 [n..m) — 0..999 の範囲の数値を生成するだけのものではありません)。
for (int i = 0; i < NUM_ITEMS; i++)
{
int j = rand();
int t = mapper[j];
mapper[j] = mapper[i];
mapper[i] = t;
}
これで、ノードの配列をスレッド化して、配列内の順序でそれらをリンクできますmapper
。配列に重複がなかったので、リストにサイクルはありません。
head = &node_array[mapper[0]];
for (i = 1; i < NUM_ITEMS; i++)
{
head->next = head;
head = &node_array[mapper[i]];
}
ほら...