2014-10-29 80 views
0

在while循環結束之前,如何在此代碼上komv-> next變爲NULL? 我注意到,在這個線路城鎮 - > previous-> next = town-> next後變爲NULL,但我不明白爲什麼發生這種情況。程序以分段故障結束。更改一個指針會影響其他指針

komv=list->First; 
     while ((komv->next)!=NULL) 
     {  


      if(town->num>=komv->next->num) 
       { 

        town->previous->next=town->next; 

        if(town->next!=NULL) 
         town->next->previous=town->previous;   
        town->next=komv->next; 
        town->previous=komv; 
        komv->next->previous=town; // gdb say komv->next=NULL 
        komv->next=town;  

        break;     
       } 
      komv=komv->next; 


     } 
+0

鎮是已在列表 – seinta 2014-10-29 14:25:36

+0

這條線的節點:當((komv->旁邊)= NULL)應該是同時(komv! = NULL),然後修改循環的其餘部分以基於當前鏈接列表節點。那麼只進入下一個節點'komv = komv-> next;'在循環結束時 – user3629249 2014-10-30 00:30:14

回答

1

如果komv是前述列表中的town,然後town->previous == komv的節點。如果town是最後一個節點,然後town->next == NULL。當這些同時是真實的,這一點:

   town->previous->next=town->next; 

簡化爲:

   komv->next = NULL; 

在這種情況下,它看起來像有沒有需要修改的列表,這樣就可以解決這個問題通過修改條件

 if ((town != komv->next) && (town->num >= komv->next->num)) { 

有可能是一個更好的解決方案,也取決於你想要什麼樣的假設和行爲。例如,如果是可以接受具有相同num節點,而不是之前,那麼你可以簡單地使用該條件後,插入town

 if (town->num > komv->next->num) { 
1

我能想到的唯一的條件是,如果town是列表中的最後一個節點,那麼你得到的最後一次迭代)

if (town->num >= komv->next->num) // komv is the previous to last element, so komv->next is town. 
{ 
    town->previous->next = town->next; // here, komv->next is changed to NULL. 
    ...