计算 C 列表中的符号变化

Counting the sign changes in a list in C

我必须获得双打列表中符号变化的次数。例如,如果有这样一个列表:“1, -1, -1, 1”,相邻元素之间有 2 个符号变化。我这样试过,但由于某种原因,如果我尝试编译它,程序会崩溃:

int number_of_sign_changes(DoubleList* list) {
    int changes = 0;
    for (DoubleNode *n = list->first; n != NULL; n = n->next) {
        if ((n->value >= 0) && (n->next->value < 0)) {
            changes += 1;
        } else if ((n->value < 0) && (n->next->value >= 0)) {
            changes += 1;
        } 
    }
    return changes;
}

循环确实有效。我在其他功能中尝试过,但在这里它不起作用。有人有想法吗?顺便说一句,您实际上可以将 2 个 if 语句放入 1 个中,我也尝试过但同样的问题。

这本质上是一个围栏post问题。可能的符号更改数比列表中的元素数少 1,因此当您检查每一项时,您可以知道您做错了什么。问题实际上发生在检查列表中的最后一项时 - 它试图检查 'next' 项的符号更改,但没有,因为 n->nextNULL .

这可以通过对 for 循环中的终止条件进行简单更改来解决,如下所示:

int number_of_sign_changes(DoubleList* list) {
    int changes = 0;
    for (DoubleNode *n = list->first; n != NULL && n->next != NULL; n = n->next) {
        if ((n->value >= 0) && (n->next->value < 0)) {
            changes += 1;
        } else if ((n->value < 0) && (n->next->value >= 0)) {
            changes += 1;
        } 
    }
    return changes;
}