Стек сования не работает правильно?(Стек из двух очередей) - PullRequest
0 голосов
/ 08 мая 2019

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

TYPE listStackPop (struct Stack* stack)
{
    /* FIXME: You will write this function */
    assert (stack != NULL);
    assert (!listQueueIsEmpty (stack->q1));
    return listQueueRemoveFront (stack->q1);
}

---later calls to listQueueRemoveFront---

TYPE listQueueRemoveFront (struct Queue* queue)
{
    /* FIXME: You will write this function */
    assert (queue != 0);
    assert (!listQueueIsEmpty (queue));
    struct Link* toDelete;
    toDelete = queue->head->next;
    if (toDelete == queue->tail) {
        queue->tail = queue->head;
    }
    else {
        queue->head->next = toDelete->next;
    }
    int retVal = toDelete->value;
    return retVal;
}

--For clarity, TYPE is defined as int--

Я пытался перейти от простого return toDelete->value к копированию значения toDelete в int и передать это int для возврата, как я думал, может быть toDelete был удален преждевременно или что-то в этом роде, но это не так. К сожалению, Google на самом деле не так много информации об этом. Так или иначе, пока.

Вот полный код на pastebin, если кому-то интересно прочитать его полностью: https://pastebin.com/cDvdHmTu

Я ожидал, что он пройдет, но по какой-то причине он не прошел, хотя все остальные тесты прошли.

Результаты:

-------------------------------------------------
---- Testing stack from queue implementation ----
-------------------------------------------------
stack init...
stackIsEmpty == 1:      PASSED

pushing 4, 5, -300...
stackIsEmpty == 0:      PASSED

popping; val == -300:   PASSED
popping; val == 5:      PASSED
top val == 4    :       PASSED
popping; val == 4:      PASSED
stackIsEmpty == 1:      FAILED

pushing 0-9...
top val == 9    :       PASSED

C:\Users\Zedri\source\repos\Stack From Queues\Debug\Stack From Queues.exe (process 8928) exited with code 0.
Press any key to close this window . . .

Используемый компилятор / IDE: Visual Studio 2019

- ~ - ~ - ~ Редактировать 1 ~ - ~ - ~ -

удален вызов malloc для указателя toDelete

~ - ~ - ~ -Edit 2- ~ - ~ - ~

Исправлен код на pastebin. Проблема решена.

1 Ответ

0 голосов
/ 09 мая 2019

Не берите в голову, мне просто нужно было переместить queue->head->next = toDelete->next; за пределы блока else и полностью удалить блок else.

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