2012-07-13 94 views
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資源管理器停止工作 代碼中的缺陷是什麼? 有沒有比這更好的算法來找到中間元素?

+0

如果列表中有奇數個元素,該怎麼辦? – pmg 2012-07-13 15:49:16

+4

這聞起來像作業... – Keplah 2012-07-13 15:54:51

+0

如果'x = x-> next-> next;'等於null? – 2012-07-13 15:57:28

回答

2

如果條目數是奇數,那麼您的x將最終爲NULL,因此當下一個循環迭代引用它時,您的程序將崩潰。你應該修改你的條件,以說明:

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

NULL對比在C可選的,因此你可以跳過!= NULL縮短狀態。

當然,通過全局變量傳遞start參數是非正統的,至少可以說。將它作爲常規函數參數傳遞會更好。

+0

你能否在代碼中解釋一下。 – OneMoreError 2012-07-13 15:52:19

+0

@CSSS這是您需要的唯一修改。替換循環條件,並運行你的代碼。其他一切似乎都很好。 – dasblinkenlight 2012-07-13 15:53:06