我参加了一次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语言中是否有其他类似的方法?
char* value
而不是char *value
?呃,不要在那里工作。 - finnwchar* value
。 - zentrunixchar* pointer1, pointer2;
的错误。没有空格的'char*'
会让人们更容易以与编译器不同的方式解读它(从而增加这种错误的可能性)。 - finnw