2011-04-06 79 views
2

我没有在2年内采取了CS类我想不通为什么这个简单的链表是腐败:为什么这个C链表损坏?

int exists(linkedlist *list, int val) { 
    if(list == NULL) 
     return 0; 

    if(list->value == val) 
     return 1; 
    return exists(list->next, val); 
} 

当我尝试执行exists(list,33);列表中的第一个值被改写为33.我被迫使用迭代的方法,并得到程序的工作,但是这个错误,因为这似乎是一个有效的解决方案。为什么它不起作用?

(注:创建节点我总是设置list->next = NULL;

+7

你确定你的代码显示'lists-> value == val' not'lists-> value = val'吗? – nmichaels 2011-04-06 13:48:14

+1

完全不相关的注意:列表参数应该是const。 – unwind 2011-04-06 13:51:57

+4

@unwind:不完全无关,我怀疑。 :) – 2011-04-06 13:54:13

回答

5

确定第二if语句是

if(list->value == val) 

,而不是

if(list->value = val) 

这是我能看到的唯一的事情那会改变价值。

+2

当你不打算修改参数时使用'const'的好理由! – GrahamS 2011-04-06 13:51:36

+0

但他没有修改参数。在这种情况下,我不认为'const'会有帮助。 – TMN 2011-04-06 15:25:25

+0

@TMN:如果他犯了@B Mitch在这里提出的错误,那么他的确在修改参数。如果参数是const(即'int exists(const linkedlist * list,int val)'),那么这个错误永远不会发生,因为编译器会抱怨。 – GrahamS 2011-04-06 17:33:38

1

什么不正确?代码看起来非常好。

尝试运行您的程序valgrind,检查您可能会丢失的内存错误。

0

顺便说一下,你的链表有多长?

在这里可能不是你的问题,但要注意你的递归方法意味着你可能会在很长的列表中产生堆栈溢出。

+0

只有几个元素。也许这是dev-cpp编译的方式?我得到了名单的腐败。 其中列表用于打印为1,2,3.在运行上述功能检查val = 22之后,它将打印为22,2,3 – user613592 2011-04-06 14:33:36

+0

是的,我认为@B Mitch和@nmichaels的答案标识了正确问题的根源。递归的东西只是你应该考虑的其他东西。 – GrahamS 2011-04-06 14:53:30