我必须在双打列表中获得符号更改的数量。例如,如果有这样的列表:" 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中,我也尝试了同样的问题。
答案 0 :(得分:2)
这实质上是围栏问题。可能的符号更改次数比列表中的元素数少一个,因此当您检查每个项目时,您可以告诉您做错了什么。实际上在检查列表中的最后一项时会出现问题 - 它会尝试检查“下一个”项目的符号更改,而没有一个,因为n->next
是NULL
。< / 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;
}