更改一个指针会影响其他指针

问题描述:

在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

如果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) { 

我能想到的唯一的条件是,如果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. 
    ...