Функция связанного списка работает при обычном вызове, но не работает при вызове в операторе IF?

#c #linked-list

#c #связанный список

Вопрос:

Итак, во-первых, у меня есть IntListInsert, который просто заполняет список

 void IntListInsert(IntList L, int v)
{
    assert(L != NULL);
    struct IntListNode *n = newIntListNode(v);
    if (L->first == NULL)
        L->first = L->last = n;
    else {
        L->last->next = n;
        L->last = n;
    }
    L->size  ;
}

  

Тогда у меня есть другая функция сортировки
Если я просто вызываю IntListInsert подобным образом, он заполняет списки должным образом, хотя и не отсортирован.

 void IntListInsertInOrder(IntList L, int v)
{
    
        IntListInsert(L, v);
}
$./list 1 2 3
123
  

Когда я пытаюсь использовать оператор IF для обработки пустых списков, он вставляет только первый объект в списке…

 void IntListInsertInOrder(IntList L, int v)
{
    //check if list is empty
    if (L->first == NULL) {
        IntListInsert(L, v);
    }
}

$./list 1 2 3
1
  

Очень ценю любой ввод 🙂

Ответ №1:

Как вы вызываете функцию IntListInsertInOrder? Я думаю, проблема в том, что if (L->first == NULL) это верно только для первого ввода 1 . После того, как u присвоено 1 списку if (L->first == NULL) , значение false.

Комментарии:

1. Похоже, в этом проблема, можете ли вы порекомендовать способ обеспечить заполнение полного списка после того, как значение L-> first больше не равно NULL?

2. Да, конечно, но зачем вам проверять, пуст ли список вообще? Я не понимаю преимущества.

Ответ №2:

После того, как вы вставили свое первое значение, L-> first больше не равно NULL, и if предотвращает вставку других значений ? Полный код был бы полезен

Комментарии:

1. Похоже, в этом проблема, можете ли вы порекомендовать способ обеспечить заполнение полного списка после того, как значение L-> first больше не равно NULL?

Ответ №3:

Функция IntListInsert добавляет только один узел при каждом своем вызове.

Когда переданный список пуст, функция устанавливает указатель first списка на вновь созданный узел.

 if (L->first == NULL)
        L->first = L->last = n;
  

Таким образом, после выхода из функции L->first не равно NULL .

С другой стороны, функция IntListInsertInOrder вызывает функцию IntListInsert только тогда, когда список изначально пуст.

 void IntListInsertInOrder(IntList L, int v)
{
    //check if list is empty
    if (L->first == NULL) {
        IntListInsert(L, v);
    }
}
  

Итак, что вы делаете, это то, что вы получаете.