我在一个 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 非常了解,并且很好地理解了指针和间接寻址,但是这个我花了一段时间才完全理解。