2016-12-21 1 views
1

두배의 목록에서 기호 변경 횟수를 얻어야합니다. 예를 들어 "1, -1, -1, 1"과 같은 목록이 있으면 인접한 요소 사이에 2 개의 부호가 변경됩니다. 나는 이것을 시도했지만 컴파일하려고하면 어떤 이유로 프로그램이 충돌한다. :C의 목록에서 부호 변화 계산하기

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; 
} 

루프가 올바르게 동작한다. 나는 다른 기능에서 시도했지만 여기서는 효과가 없을 것이다. 누구나 아이디어가 있습니까? Btw를 사용하면 실제로 2 if 문을 1에 넣을 수 있습니다.

+1

가'n'이 목록의 마지막 노드가있을 때 일어나는 일에 대해 생각하고,'N-> next '는 널 포인터입니다. –

+0

감사합니다! – NoIdea

답변

2

이것은 본질적으로 펜스 포스트 문제입니다. 가능한 기호 변경 수는 목록의 요소 수보다 하나씩 작습니다. 따라서 각 항목을 검사 할 때 잘못되었다는 것을 알 수 있습니다. 실제로 문제는 목록의 마지막 항목을 검사 할 때 발생합니다. '다음'항목에 대한 부호 변경을 확인하려고 시도하지만 아무 것도 없습니다. 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; 
}