2011-03-18 5 views
2

현재 코드로 인해서 알 수는 있지만 함수 내에서 실행되는 if 문은 이와 같이 보이지만 컴파일되지 않는 if 문이 있습니다. 조건 2와 3 사이에서 실행.'if'문 조건 사이에 코드 삽입

내가 뭘하려는 건 올바른 위치에 정수의 정렬 된 연결 목록에 새 노드를 삽입하는 함수를 만드는 것입니다. 이렇게하면 세 가지 조건을 테스트해야합니다. 첫 번째는 목록이 비 었는지 여부입니다. 그렇다면 condition1을 만족하고 모두 좋다. 두 번째 조건은 현재 목록에있는 노드가 하나만 있는지 여부입니다. 이 경우에 condition2이 만족되며 다시 좋은 결과를 얻을 수 있습니다.

이제 문제가 발생합니다. 처음 두 조건이 충족되지 않으면 목록에 노드가 두 개 이상 포함될 수 있습니다. 이 경우 두 개의 임시 포인터를 초기화해야하며, 하나는 Head을 가리키고, 하나는 Head -> Next을 가리키면 목록의 현재 위치를 추적하고 새 노드를 목록에 쉽게 삽입 할 수 있습니다.

이들은 condition2condition3 사이에있는 코드를 사용하여 초기화됩니다. condition3이 의존하기 때문에 생성해야하지만 condition1 전에 세그먼트를 생성하면 세그먼트 화 오류가 발생합니다.

누구나 그러한 진술을 구현하는 방법에 대해 조언 해 줄 수 있습니까? 나는 가능한 한 간단하게 코드를 유지하고 싶습니다. 그리고 완전히 작동하는 LinkedList :: Insert() 함수는 현재 if 문장의 엉망이며 일부 코드를 따르는 데 문제가 있습니다.

int NewElement; 
Node *NewNode; 
NewNode = new Node; 
NewNode -> Element = NewElement; 

Node *TempPrevious; 
Node *TempNext; 

    if (ListIsEmpty) // condition1 
    { 
     // some code 
     return true; 
    } 

    else if (ListContainsOnlyOneNode) // condition2 
    { 
     // some code 
     return false; 
    } 

    TempPrevious = Head; 
    TempNext = Head -> Next; 

    else if (NewNode -> Element > TempNext -> Element) // condition3 
    { 
      // some code 
      return true; 
    } 

답변

6

이것은 실제로 쉽습니다. 각 블록에서 return을 보내고 있기 때문에 else은 전혀 필요하지 않습니다.

if (ListIsEmpty) // condition1 
{ 
    // some code 
    return true; 
} 

// you don't have anything that needs to happen here, but you *could* 
// since if condition1 is met control leaves the function immediately 

if (ListContainsOnlyOneNode) // condition2 
{ 
    // some code 
    return false; 
} 

// if either of the previous conditions are met, 
// control will never reach this point! So put whatever setup you need for 
// the final test here 

TempPrevious = Head; 
TempNext = Head -> Next; 

if (NewNode -> Element > TempNext -> Element) // condition3 
{ 
     // some code 
     return true; 
} 
4

마지막으로 else을 제거하십시오. 나는 원하는대로 작동 할 것이라고 생각합니다.