1

我有一个问题:如果它们相等,下面的函数会在第二个中复制指针链表的列表。外汇清单1 = 1 2 3 3 5 6 7 7 7

调用后的结果将是:

列表 2 = 3 7

node *seqdup(node *lis)
{
    if(lis == NULL)
        return NULL;
    else if (lis->next != NULL)
        {
            if(lis->data == lis->next->data)
                {
                    node *p;
                    p = newnode();
                    p->data = lis->next->data;
                    p->next = seqdup(lis->next);
                    return p;
                }
            else
                return seqdup(lis->next);
        }
}

我知道这是一个无用的功能,它是用于学校考试的。

它的问题是:我完成了一项学校作业,并且由于不包括诸如“if (lis->next == NULL) return NULL;”之类的条件,在 10 分中总共得到 2 分。由于在读取列表的最后一个节点时,该函数什么也不做: fx if the lis is 1 1 3 4

对于第一个节点,lis->next != NULL,他发现 1 == 1` 所以在 lis 2 中复制第二个节点,lis->next != NULL 和 1 != 3,所以 rec 调用,但没有复制然而,第三个,因为 3 != 4,它什么也不做

问题是,只要我在递归调用之后分配 lis->next,第二个列表的最后一个复制节点基本上就会指向一个什么都不做的函数。

显然,我的老师对这个问题的严厉态度是正确的,因为有很多简单的方法可以解决它。然而,我的问题是:为什么它仍然有效?

试图把它写下来并编译它,就像一个魅力:/

4

1 回答 1

3

如果它对你有用,那只是意味着你很幸运,当条件失败时,eax 寄存器恰好为零。所以就好像你return NULL在函数的末尾有一个。

当我在编译器中对此进行测试时,情况并非如此,并且代码不起作用。对我来说, eax 寄存器保存了lis的值,所以就好像你return lis在函数的末尾有了一样。那只是产生了一个永远循环的列表。

于 2013-07-19T00:01:15.140 回答