3

我编写了以下函数,它返回链表的中间元素,它使用双指针方法

struct node
{
int data;
struct node *next;
}*start;

void middleelement()
{
struct node *x=start,*y=start;
int n=0;

if(start==NULL)
{
    printf("\nThere are no elments in the list");
}

else
{
    while((x->next)!=NULL)
    {
        x=x->next->next;
        y=y->next;
        n++;
    }

    printf("\nMiddle element is %d",y->data);
}
}

但是,每当我运行这些函数时,Windows 资源管理器就会停止工作 代码中的缺陷是什么?有没有比这更好的算法来找到中间元素?

4

1 回答 1

2

如果条目的数量是奇数,你x最终会是NULL,所以当下一个循环迭代引用它时,你的程序将会崩溃。您应该修改您的条件以解决此问题:

while(x && x->next) {
    ...
}

比较NULL在 C 中是可选的,因此您可以跳过!= NULL来缩短条件。

当然,start通过全局变量传递参数是非正统的,至少可以这么说。将它作为常规函数参数传递会更好。

于 2012-07-13T15:50:22.463 回答