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

问题描述 投票:0回答:1

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

让我尝试解释一下,我的作业需要创建一个函数,该函数将采用 2 个参数(自定义列表)和 x 一个 int。它将使用带有“out”参数的子函数。

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

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

代码:

void SubAddBeforeLastZero(List *l, int x, Liste *lastOcc) {
    if (isEmpty(*l)) {
        if (*lastOcc != NULL) { // Zero has been found
            stack(x, lastOcc);
        } else{
            // No Zero
            stack(x, l);
        }
    } else {
        if (value(*l) == 0) {
            *lastOcc = *l;  // Assign address of zero found
        }
        SubAddBeforeLastZero(&(*l)->next, x, lastOcc);
    }
}

void AddBeforeLastZero(List *L, int x) {
    List lastOcc = NULL;
    SubAddBeforeLastZero(L, x, &lastOcc);
}

主要很简单,我用 (&l, 5) 调用该函数。

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

感谢您的帮助

编辑:可重现的环境:https://ideone.com/0QRnxi

c recursion linked-list
1个回答
0
投票

这是你的问题:

*lastOcc = *l

您使用的

lastOcc
始终是您在
AddBeforeLastZero
中创建的局部变量:

List lastOcc = NULL;

您正在使用间接寻址

*Liste
就地覆盖指针,但
lastOcc
永远不是链表的一部分,因此覆盖其值没有任何效果。

你想要的是这样的:

lastOcc = l

现在,您将能够覆盖头部

l
或一些
l->next

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

© www.soinside.com 2019 - 2024. All rights reserved.