C虽然循环表现得很有趣

时间:2014-09-14 03:45:19

标签: c

我有一个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

2 个答案:

答案 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不再指向循环后列表中的第一个元素。