11 Stimmen

Ein interessantes Idiom für verknüpfte C-Listen

Ich war bei einem Vorstellungsgespräch für eine C-Stelle, bei dem man mir ein Idiom vorstellte, das mir vorher noch nicht begegnet war. Es handelt sich dabei um einen Trick, der die Implementierung verschiedener Algorithmen mit verknüpften Listen vereinfacht, und ich frage mich, ob noch jemand auf dieses Idiom gestoßen ist.

Nehmen wir an, wir haben einen verknüpften Listensatz, der so definiert ist:

typedef struct _record
{
    char* value;
    struct _record* next;
} record;

Wir brauchen eine Funktion, die einen neuen Datensatz einfügt, so dass die gesamte Liste in Bezug auf die Werte in den Datensätzen sortiert bleibt. Die folgende Implementierung ist einfacher als alles, was ich verwendet hätte, wenn auch weniger lesbar.

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;
}

Wenn die Funktion aufgerufen wird, zeigt r auf den Kopfzeiger der Liste. Während der while-Schleife wird r aktualisiert und zeigt auf den next des Datensatzes, der kurz vor dem Punkt liegt, an dem der neue Datensatz eingefügt werden soll. Die letzte Zeile der Funktion aktualisiert entweder den Kopfzeiger der Liste (wenn das Einfügen am Anfang erfolgt) oder den next Feld des bisherigen Rekords, was ziemlich cool ist.

Ich habe ein paar Fragen:

  • Hat diese Redewendung einen Namen oder wird sie in der Literatur erwähnt?

  • Gibt es in der Sprache C noch weitere derartige Funktionen?

Ich dachte, ich kenne C ziemlich gut und hatte Zeiger und Indirektion ziemlich gut verstanden, aber das hier hat mich eine Weile gekostet, um es ganz zu verstehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X