我编写了以下函数,它返回链表的中间元素,使用双指针方法
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资源管理器就会停止工作代码中的缺陷是什么?有比这更好的算法来找到中间元素吗?
如果条目数为奇数,则x
最终将为NULL
,因此当下一个循环迭代引用它时,程序将崩溃。你应该修改你的条件来说明这一点:
while(x && x->next) {
...
}
在C中,与NULL
进行比较是可选的,因此您可以跳过!= NULL
来缩短条件。
当然,至少可以说,通过全局变量传递start
参数是非正统的。最好将它作为一个正则函数参数传递。