Я был в интервью для позиции С, в которой они представили мне идиому, с которой я раньше не встречался. Это трюк, который упрощает реализацию различных алгоритмов, связанных с связанными списками, и мне интересно, встретил ли кто-нибудь еще это.
Скажем, у нас есть связанная запись списка, поэтому:
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 очень хорошо, и указатели и косвенность довольно хорошо разобрались, но мне это потребовалось некоторое время, чтобы полностью понять.