尾部递归函数,以便在元素前插入 x

Tail recursive function in order to insert x before an element

提问人:Alex 提问时间:10/13/2023 最后编辑:Alex 更新时间:10/13/2023 访问量:65

问:

我有一个赋值,要求我在 C 中创建一个函数,以便在链接列表的最后 0 之前插入一个参数 x。我已经尝试了所有方法,我的最后一次尝试感觉它应该有效。但要么我的逻辑被打破了,要么我对指针的了解很糟糕。

让我试着解释一下,我的赋值需要创建一个函数,该函数将接受 2 个参数、一个自定义列表和 x 一个 int。它将使用带有“out”参数的子函数。

所以我做了什么,我走到这个列表的末尾,如果我遇到一个 0,我会将其地址存储在我的 out 参数中(类型:List)。 当我的列表为空时,如果没有找到零,我会在末尾堆叠 x,或者我会将其插入到 out 参数的地址。

当我调试时,我可以看到地址已正确分配,我的“插入”已正确完成(至少在“out”参数中),但是当我在调用后检查时,它不会更改“l”的值。它在最后插入时有效,但仅此而已。

代码

        if (value(*l) == 0) {
            *lastOcc = *l;  // Assign address of zéro

// i'll add back the question after the deadline to avoid trouble, but the answer was here

main 很简单,我用 (&l, 5) 调用函数。

我希望我已经说得足够清楚了。你能指出我错过了什么吗,我真的很想理解为什么我的逻辑现在是失败的。

感谢您的帮助

c 递归 链接列表

评论

2赞 ggorlen 10/13/2023
仅供参考,使用循环会更容易编码,客观上会更好(长列表没有堆栈溢出!展示如何调用此函数对于完全可运行的最小可重现示例很有用。谢谢。
2赞 Fe2O3 10/13/2023
递归是赋值的必要部分吗?
0赞 Alex 10/13/2023
是的,我们有 3 个版本要做,一个“终止”版本(不知道它在英语中是怎么说的,但那个在调用后什么都不做)、一个没有终止的版本和一个迭代版本。这是我必须做的最后一件事。我用一种代码笔编辑了我的答案@ggorlen
0赞 0___________ 10/13/2023
@Alex从函数返回!如果插入的那个会变成一个新的头怎么办?- 我看到你把指针藏在 typedefs 后面 - 一个非常坏的习惯
0赞 Alex 10/13/2023
@0____如果我把它作为头部,我将不得不在递归的途中堆叠以前的值,没有?我无法想象它,如果我这样做,这意味着它将在通话后运行,这违反了本练习的规则。没有犯这个错误,这部分代码是我的老师做的啊哈

答:

2赞 Emilio Silva 10/13/2023 #1

这是你的问题:

*lastOcc = *l

您正在使用的始终是您在 :lastOccAddBeforeLastZero

List lastOcc = NULL;

您正在使用间接来就地覆盖指针,但从来都不是链表的一部分,因此覆盖其值不起作用。*ListelastOcc

你想要的是这个:

lastOcc = l

现在,您将能够覆盖头部或一些.ll->next

请参见 https://ideone.com/Zo3f7e

评论

0赞 Alex 10/13/2023
非常感谢你,很明显我做错了什么......我会在考试中避免这个错误。无论如何,谢谢,我将隐藏线程以避免暂时复制 xode,但我会在截止日期后将其展示回来