リンク リストのインターフェイスを公開するデータ構造を実装するためにポインターを実際に使用する必要はありませんが、リンク リストのパフォーマンス特性を提供するために必要です。
ポインターの代わりになるものは何ですか? さて、item
次の項目を参照する何らかの方法が必要です。さまざまな理由で次の項目を集約できません。そのうちの 1 つは、これにより構造体が「再帰的」になり、実現できないことです。
// does not compile -- an item has an item has an item has an item has...
typedef struct item
{
type data;
struct item next;
} Item;
あなたができることは、アイテムの配列を持ち、その上にリンクされたリストを実装することです:
Item *storage[100];
typedef struct item
{
type data;
int next; // points to the index inside storage of the next item
} Item;
これは機能するようです。リストにアイテムを追加する関数と、それらを削除する別の関数を使用できます。
void add_after(Item *new, Item *existing);
void remove(Item *existing);
existing
これらの関数は、配列から削除して (next
前の項目の「ポインター」を更新するように注意して) 空のスロットを作成するか、existing
項目を見つけて空のスロットに挿入new
しますstorage
(そこを指すように更新next
します)。
これに関する問題は、スペースがなくなるたびに配列を検索して再割り当てする必要があるため、 add_after
and操作を一定時間で実現できないことです。remove
一定時間の追加/削除が人々がリンクされたリストを使用する理由であるため、これにより、非ポインターアプローチは知的な演習としてのみ役立ちます。実際のリストの場合、ポインターを使用すると、これらの操作を一定の時間で実行できます。