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

时间:2014-10-29 14:16:41

标签: c pointers struct

在while循环结束之前,komv-> next如何在此代码中变为NULL? 我注意到在这个行之后变成了NULL - > previous-> next = town-> next但是我无法理解为什么会发生这种情况。程序因分段错误而终止。

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;


        }

2 个答案:

答案 0 :(得分: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)) {

根据您想要的假设和行为,也可能有更好的解决方案。例如,如果在具有相同town而不是之前的节点之后插入num 是可以接受的,那么您可以简单地使用此条件:

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

答案 1 :(得分: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.
   ...