- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在面试 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
字段,该记录恰好在我们要放入新记录的点之前。函数的最后一行更新 head列表的指针(如果插入发生在开头)或上一条记录的 next
字段,这很酷。
几个问题:
这个成语有没有名字或者在任何文献中提到过?
C语言中还有类似的吗?
我以为我非常了解 C,并且对指针和间接寻址非常了解,但是我花了一段时间才完全理解。
最佳答案
我用类似的方法插入到二叉树中。因为在迭代树时,您通常会在指针变为 NULL
(您跑出树)时停止。
所以要插入,您有 3 个选项,
1:使用一个变量来跟踪迭代指针的先前值。
2:当你要跟随的指针为 NULL 时停止,然后再跟随它,有效但在我看来稍微不那么优雅。
3:或者更优雅的解决方案是简单地使用指向指针的指针,所以你可以这样做:*it = new_node();
它会将它添加到 的位置NULL
曾经在你的树中。
对于链表,虽然这段代码工作得很好,但我通常只使用双向链表,这使得在任何位置插入变得微不足道。
关于c - 一个有趣的 C 链表习语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/332441/
文档:https://www.xfyun.cn/doc/spark/PPTGeneration.html 价格方面提供了免费1000点的额度,生成一次是10点,正好10
我有一个工具按钮和一个分配给它的操作。但该操作没有点击事件,也没有点击代码。因此该按钮被禁用,如何将其更改为启用? 谢谢! 最佳答案 当某个操作没有 OnExecute 处理程序时,该操作始终处于禁用
我有一个 C 程序,它初始化两个结构并尝试打印它们的值。请参阅下面的代码。 #include #include typedef struct node{ int data; struc
我在回答 this question当我想到这个例子时: #include void func(int i); void func(); int main (){ func(); r
这些bug可能够你喝一壶的。 1、被断言(assert)包含的代码 常发生在切换到release版本时,执行结果乖乖的,最终查找结果是assert括号里的代码在release下是不执行的。
我正在谈论一个独立的对象,稍后我想使用 saveOrUpdate() 进行更新。 我们如何同时设置 null 和clear()引用的集合? A[1:1]B[1:M]C B 到 C 的引用可以为空,这意
我最近完成了 Marjin Haverbeke 的书“Eloquent Javascript, Second Edition”中的一项挑战。 One had to create此控制台输出使用 for
我写了一个 HtmlHelper 表达式,我花了很多时间将标题标签放入我的下拉列表中,如下所示: public static HtmlString SelectFor( thi
你知道有哪些开放的软件项目有特别有趣/写得很好的单元测试吗? 编写单元测试对我来说通常感觉很奇怪,因为它似乎太随机、太密集、太稀疏,……阅读一些现实世界的例子(而不是书籍、图书馆示例代码等)会很棒。
我有一个我目前正在使用的 Silverlight 应用程序,它为其 MVVM 框架实现了 Caliburn.Micro。一切正常,但我注意到一些绑定(bind)中的一些有趣之处。我拥有的是处理应用程序
我通过 swscale 运行 png 图像数据以获取 YUV420P 数据,然后使用 MSMPEG4V1 编解码器对该帧进行编码,从而在 iPhone 上对一些视频进行编码。在 api 文档中,avc
我写了一个页面,发现 addEventListener("loadedmetadata",fun) 在 firefox 上运行不正确 我正在尝试修复一个旧软件的错误。在加载视频和页面时,该软件尝试在页
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一名优秀的程序员,十分优秀!