Проблемы, создающие Очередь Шаблона

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

template 
struct Node{
    type data;
    Node *next;
};

template 
class LinkedListQueue{
public:
    LinkedListQueue();
    void push(type new_data);
    void pop();
    type front();
    void print();

private:
    Node *head;
    Node *tail;
};

template 
LinkedListQueue::LinkedListQueue(){
    this->head = NULL;
    this->tail = NULL;
}

template 
void LinkedListQueue::push(type new_data){
    Node *newNode;
    newNode->data = new_data;
    newNode->next = NULL;

    if(this->head == NULL){
        this->head = newNode;
        this->tail = newNode;
    }else{
        this->tail->next = newNode;
        this->tail = newNode;
    }
}

template 
void LinkedListQueue::pop(){
    if(this->head != NULL){
        this->head = this->head->next;
        if(this->head == NULL){
            this->tail == NULL;
        }
    }else{
    cout << "Queue is Empty" << endl;
    }
}

template 
type LinkedListQueue::front(){
    return(this->head->data);
}

int main() {
    LinkedListQueue newQueue;
    newQueue.push(5);
    newQueue.push(4);
    cout << newQueue.front() << endl;
    newQueue.pop();
    cout << newQueue.front() << endl;
}

Я испытываю затруднения при определении, где проблема. Если я комментирую от поп и последнего переднего требования, первый фронт() называют продукцию правильно. Однако некомментарий поп и фронта ломает все. Когда я пытаюсь отладить поп (), кажется, что в списке есть только один Узел.

Любая помощь значительно ценилась бы.

0
nl ja de
Необходимо попытаться использовать отладчик.
добавлено автор R. Martinho Fernandes, источник

2 ответы

Вот большое проблема:

Node *newNode;
newNode->data = new_data;

Вы объявляете указатель и начинаете получать доступ к нему непосредственно, не ассигнуя память для него. Это значит пункты указателя для на вид случайного местоположения. приводя к <ним> неопределенное поведение и странные вещи, происходящие, должно ожидаться.

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

0
добавлено

Вы не ассигнуете свой новый узел. просто хранить данные.

Node *newNode; //<=== indeterminate pointer
newNode->data = new_data;
newNode->next = NULL;

Так или иначе вы всегда выдвигаете новый элемент в, поэтому ассигнуйте его, настройте его, затем выясните, куда он идет. Кроме того, создайте конструктора для своего узла, который берет константу - касательно данных и устанавливает следующее за ПУСТЫМ УКАЗАТЕЛЕМ. Это делает ваш код значительно более прямым (и на самом деле более эффективный):

Node *newNode = new Node(new_data);

Со становлением шаблона Узла:

template 
struct Node
{
    Node(const type& value) 
        : data(value), next(NULL) {};
    type data;
    Node *next;
};

Наконец, ваш поп() не удаляет узел, просто унавозив с указателями. можно хотеть обратиться к этому также.

template 
void LinkedListQueue::pop()
{
    if(this->head != NULL)
    {
        Node* victim = this->head;
        this->head = this->head->next;
        if(this->head == NULL)
            this->tail == NULL;
        delete victim;//<=== note: deleting node.
    }
    else
    {
        cout << "Queue is Empty" << endl;
    }
}
0
добавлено
@user2017001, как мне жаль, что не были верны.
добавлено автор WhozCraig, источник
Большое спасибо. Ваш ответ очень полезен.
добавлено автор Komitue, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest