私は C 職の面接を受けていましたが、そこで彼らは私が以前に遭遇したことのないイディオムを提示されました。これは、リンクされたリストを含むさまざまなアルゴリズムの実装を簡素化するトリックであり、他の誰かがこれに遭遇したかどうか疑問に思っています.
次のように定義されたリンク リスト レコードがあるとします。
typedef struct _record
{
char* value;
struct _record* next;
} record;
リスト全体がレコード内の値に関してソートされたままになるように、新しいレコードを挿入する関数が必要です。次の実装は、読みにくいとはいえ、私が使用したどの実装よりも単純です。
void insert_sorted(record** r, const char* value)
{
record* newrec = NULL;
while(*r && strcmp(value, (*r)->value) > 0)
r = &((*r)->next); /* move r to point to the next field of the record */
newrec = malloc(sizeof(record));
newrec->value = strdup(value);
newrec->next = *r;
*r = newrec;
}
関数が呼び出されると、r はリストの先頭ポインターを指します。while ループの間、r が更新されてnext
、新しいレコードを挿入したいポイントの直前にあるレコードのフィールドを指すようになります。関数の最後の行は、リストのヘッド ポインターを更新します (挿入がが最初に発生する) またはnext
前のレコードのフィールド、これは非常にクールです。
いくつかの質問:
このイディオムには名前がありますか、それとも文献で言及されていますか?
C言語で似たようなものは他にありますか?
私は C をかなりよく知っていて、ポインターと間接参照をかなりよく理解していると思っていましたが、これは完全に理解するのに時間がかかりました。