计算符号在C中的列表中更改

时间:2016-12-21 13:47:34

标签: c list for-loop nodes sign

我必须在双打列表中获得符号更改的数量。例如,如果有这样的列表:" 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中,我也尝试了同样的问题。

1 个答案:

答案 0 :(得分:2)

这实质上是围栏问题。可能的符号更改次数比列表中的元素数少一个,因此当您检查每个项目时,您可以告诉您做错了什么。实际上在检查列表中的最后一项时会出现问题 - 它会尝试检查“下一个”项目的符号更改,而没有一个,因为n->nextNULL。< / p>

这可以通过简单更改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;
}