当前位置:  开发笔记 > 编程语言 > 正文

一个有趣的C链表成语

如何解决《一个有趣的C链表成语》经验,为你挑选了2个好方法。

我正在接受一个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并且很好地指出了指针和间接,但是这个让我花了一些时间来完全理解.



1> Will Dean..:

我会说成语是"那种给'c'起个坏名字的代码"

毫无根据的聪明

无根据的紧凑

令人惊讶的呼叫者副作用

在malloc上没有错误处理

仅适用于美国英语字符串


它看起来很简单,而不是"聪明",而且是典型的示例代码,它忽略了错误检查并使用了明显的库函数.
哇,Dean真的讨厌C.它不是太聪明或紧凑,它是典型的C代码.它确实调用了呼叫者想要的内容.如果它模糊了这一点,最好在发布时忽略错误处理.
@Tim,我喜欢"我错误地在2001年为一家公司找到了一份工作" - 什么,你走过他们的建筑物,不小心摔到门口并签署了录取通知书?:-)
传入的指针未标记为const,因此当然会向调用者发出可能会更改的信号?

2> Evan Teran..:

我已经使用类似的东西插入到二叉树中.因为在迭代树时,通常在指针变为停止时停止NULL(你跑掉了树).

所以要插入,你有3个选项,

1:使用跟踪迭代指针的先前值的变量.

2:当你跟随它之前你所遵循的指针是NULL时停止,在我看来工作但稍微不那么优雅.

3:或者更优雅的解决方案只是使用指向指针的指针,所以你可以这样做:*it = new_node();它会将它添加NULL到你原来在树中的位置.

对于链表,虽然这段代码运行良好,但我通常只使用双向链表,这使得在任何位置插入都很简单.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有