在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;
}
答案 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.
...