Размещение кода между условиями оператора if - PullRequest
2 голосов
/ 18 марта 2011

В настоящее время у меня есть оператор if, выполняемый из функции, который выглядит следующим образом, но не компилируется, хотя я знаю, что это из-за кода, который я выполняю между условиями 2 и 3.

Я пытаюсь создать функцию, которая будет вставлять новый узел в отсортированный связанный список целых чисел в правильной позиции. Сделай это, мне нужно проверить на три условия. Во-первых, является ли список пустым. Если это так, то condition1 удовлетворено, и все хорошо. Второе условие - есть ли в списке только один узел. Если это так, то condition2 удовлетворен, и снова все хорошо.

Теперь мы подошли к проблеме. Если первые два условия не выполняются, то единственная другая возможность состоит в том, что список содержит как минимум два узла. В этом случае необходимо инициализировать два временных указателя, один из которых указывает на Head, а другой на Head -> Next, чтобы отслеживать текущую позицию в списке и облегчить вставку нового узла в список.

Они инициализируются с использованием кода, который находится между condition2 и condition3. Они должны быть созданы, потому что 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;
    }

Ответы [ 2 ]

6 голосов
/ 18 марта 2011

Это ... на самом деле очень просто.Так как вы 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 голосов
/ 18 марта 2011

Удалите последний else, и я думаю, что он будет работать, как вам нравится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...