在while循环结束之前,komv->next在这段代码中怎么可能变成空的呢?
我注意到在这行town->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;


        }

最佳答案

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

关于c - 一个指针的变化会影响其他指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26632667/

10-11 18:51