Я работаю над реализацией Двухсторонней очереди в виде двусвязного списка (для личного обогащения), и мне было интересно, если кто-то возражает, взглянуть на мою функцию PushFront, чтобы увидеть, если я нахожусь направильном пути.Само по себе это должно быть достаточно понятным (я надеюсь).
void DeQueue::PushFront(void* item) {
QueueItem* temp = new QueueItem();
temp->data = item;
// Insert the item between the head and the head's next item.
if (Empty()) {
head->next = temp;
tail->last = temp;
temp->next = tail;
temp->last = head;
} else {
temp->next = head->next;
temp->last = head;
head->next->last = temp;
head->next = temp;
}
}
Идея состоит в том, что мои стражи головы и хвоста держатся на концах, что мне кажется лучшим способом избежатькрайние случаи.
РЕДАКТИРОВАТЬ: Чтобы избежать путаницы, я знаю, что это было сделано для меня в стандартной библиотеке.Я делаю это как способ научить себя нескольким вещам о языке.
РЕДАКТИРОВАТЬ: Кажется, у меня есть идея.Теперь интересная проблема:
void* DeQueue::PopFront() {
if (Empty()) return NULL; // should throw exception instead.
void* temp = head->next->data;
head->next->next->last = head;
head->next = head->next->next;
// now my node is gone... How do i free the memory
// of something I've lost the reference to?
return temp;
}