#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);
}
}
Итак, что вы делаете, это то, что вы получаете.