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