Выписка из очереди в LinkedList - PullRequest
2 голосов
/ 09 февраля 2012

Я пытаюсь заставить мой метод dequeue работать над моей реализацией ADT LinkedList.Однако он удаляется из начала очереди вместо конца.Любая помощь с этим?Я новичок в C и пытаюсь перенести Java-упражнение на C. Предполагается удалить последний узел списка.

Вот мой метод удаления:

static void linkedQueueDequeue(Queue* q) {
    LinkedQueue *lq = ((LinkedQueue*)q->privateData);
    Node* temp = lq->head->next;
    lq->head->data = lq->head->next->data;
    lq->head->next = temp->next;
    free(temp);
    lq->size--;


}

Вот вывод при попытке удалить из очереди последний узел:

=====================
|Testing LinkedQueue|
=====================
adding 1 to first node
adding 2 to second node
adding 3 to third node
adding 4 to fourth node
[1,2,3,4]
dequeue last node
should print [1,2,3]
[2,3,4]
return first node
peek: 2
what's the size?
size: 3

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Как вы уже видели, код в connectedQueueDequeue выдает первую запись, как если бы вы хотели стек (LIFO), вы можете перебрать ваш temp до конца списка, а затем удалить его temp->next:

static void linkedQueueDequeue(Queue* q) {
    LinkedQueue *lq = ((LinkedQueue*)q->privateData);
    Node* temp = lq->head->next;
    while(temp->next) temp = temp->next;
    free(temp->next);
    temp->next = 0;
    lq->size--;
}

Также обратите внимание, что в реализации Queue / LinkedQueue есть что-то немного странное, учитывая преобразование (LinkedQueue*)q в строке 2. Вы уверены, что вам нужен этот приведение?Я не могу сказать, потому что вы не дали нам определения Queue и LinkedQueue.Может быть, есть также ->tail в LinkedQueue?Если это так, то вам не нужна итерация, и вместо этого вы можете использовать ->tail для позиционирования temp (и, конечно: вам нужно обновить ->tail до нового конца).

0 голосов
/ 09 февраля 2012

Ваш вывод выглядит как правильный для очереди / FIFO, поскольку первый элемент, который будет удален из списка, является первым элементом, который был добавлен в список. Вместо этого вы пытаетесь создать стек?

...