十年前,我看到了一种遍历链表的技术:使用双指针(指向指针),而不是使用单个指针.
通过消除检查某些边界/边缘情况的需要,该技术产生了更小,更优雅的代码.
有谁知道这种技术究竟是什么?
我正在接受一个C位置的采访,他们向我展示了一个我以前没有遇到的习语.这是一个简化涉及链表的各种算法的实现的技巧,我想知道是否有其他人遇到过这个问题.
假设我们定义了一个链表记录:
typedef struct _record
{
char* value;
struct _record* next;
} record;
Run Code Online (Sandbox Code Playgroud)
我们需要一个插入新记录的函数,以便整个列表保持对记录中的值进行排序.以下实现比我将使用的任何内容都简单,尽管可读性较差.
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;
}
Run Code Online (Sandbox Code Playgroud)
调用该函数时,r指向列表的头指针.在while循环期间,r被更新为指向next
我们想要放入新记录的点之前的记录字段.函数的最后一行要么更新列表的头指针(如果插入的话)发生在开头)或next
前一个记录的字段,这很酷.
几个问题:
这个成语是否有名称或在任何文献中都提到过?
在C语言中还有其他类似的吗?
我以为我非常了解C并且很好地指出了指针和间接,但是这个让我花了一些时间来完全理解.
我一直使用这种malloc风格
int *rc = 0;
rc = malloc(sizeof(*rc));
Run Code Online (Sandbox Code Playgroud)
然而,这并不赛格故障,即使当我打电话sizeof(*rc)
我认为rc==0
,而且我解引用NULL
指针.