C,列表的最后一个元素指向什么

时间:2013-07-18 23:45:46

标签: c list pointers recursion linked-list

我有一个问题:如果它们相等,则以下函数在第二个函数中复制指针链表的列表。 FX list1 = 1 2 3 3 5 6 7 7 7

通话后的结果将是:

list2 = 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)”之类的条件的练习中从10个中得到了总共2个点,返回NULL; 由于在读取列表的最后一个节点时,该函数将无效:fx如果lis为1 1 3 4

对于第一个节点,lis-> next!= NULL他找到1 == 1`所以副本在lis 2 对于第二个,lis-> next!= NULL,并且1!= 3,所以重新调用,但没有副本 然而,第三个,因为3!= 4,它什么都不做

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

显然我的老师对这个问题很严厉是正确的,因为有很多简单的方法可以解决它。我的问题是:为什么它一直在工作?

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

1 个答案:

答案 0 :(得分:3)

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

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