我有一个while循环操纵变量'top',一个指针在链表上运行,直到满足某些条件。没什么大不了的。
在循环之外,当我尝试让我的列表上的另一个节点指向“顶部”时,我得到一个无限循环的乱码。
我不明白为什么会发生这种情况,因为我已经在循环之外了!
代码:
//defining a node
struct Node
{
int info;
int frequency;
struct Node *next;
};
typedef struct Node Node;
//the loop
while(top->info != p->info && top->frequency != frequency && top != NULL && top != p)
{
last = top;
top = top->next;
}
//the problem
o->next = p->next;
last->next = p;
p->next = top; //when I remove this line, everything works just fine
答案 0 :(得分:0)
这个条件:
top->info != p->info && top->frequency != frequency && top != NULL && top != p
没有多大意义。
如果top == NULL
可能,那么你需要在之前检查,你得到top->info
(因为否则后者可以尝试取消引用空指针)。您的编译器可能已经检测到这种情况没有意义,并且以一种使错误显示为奇怪行为的方式对结果代码进行优化。
这个条件没有意义的另一个原因是在检查top != p
之后检查top->info != p->info
是多余的,因为后者需要前者;但至少这一个不会导致未定义的行为。
如果你改变条件更有意义:
top != NULL && top->info != p->info && top->frequency != frequency
你可能会发现问题消失了。
答案 1 :(得分:0)
也许顶部指针指向一些垃圾值?它可能已达到NULL,然后您已将该值分配给p-> next。 Top将保留循环期间的最后一个值。出来后它不会被重置。因此,top不再指向循环后列表中的第一个元素。