вызов очереди basei c функций (поставить) (программа вылетает) - PullRequest
1 голос
/ 23 марта 2020

Итак, я написал несколько базовых c операций для изучения очередей. Проблема в том, что при запуске программы происходит сбой, и я не знаю почему. Код: header

#ifndef HEADER_H_
#define HEADER_H_

typedef int Atom;
struct Element {
    Atom info;
    Element* succ;
};

struct Queue {
    Element *head, *tail;
};

Queue InitQ(void);
bool IsEmpty(Queue q);
void Put(Queue& q, Atom x);
Atom Get(Queue& q);
void PrintQ(Queue q);

#endif 

функции

#include <iostream>
#include "header.h"
using namespace std;

Queue InitQ(void)
{
    Queue q;
    q.head = q.tail = 0;
    return q;
}

bool IsEmpty(Queue q)
{
    if (q.head == NULL && q.tail == NULL)
        return true;
    else
        return false;
}

void Put(Queue& q, Atom x)
{
    Element *p = new Element;

    if (q.head == nullptr)
    {
        q.head = q.tail = p;
    }
    else
    {
        q.tail = q.tail->succ = p;
    }
}

Atom Get(Queue& q)
{
    Element* p = q.head;
    int aux;
    aux = p->info;
    q.head = p->succ;
    if (q.head == nullptr) q.tail = nullptr;
    delete(p);
    return aux;
}

void PrintQ(Queue q)
{
    if (IsEmpty(q))
    {
        cout << "Empty queue";
    }
    else
    {
        Element* p = q.head;
        while (p != NULL)
        {
            cout << p->info << " ";
            p = p->succ;
        }

    }
}

основной файл

#include <iostream>
#include "header.h"
using namespace std;

int main()
{
    Queue q=InitQ();
    Put(q,2);
    Put(q, 3);
    Put(q, 7);
    PrintQ(q);
    Get(q);
    PrintQ(q);
    return 0;
}

Когда я вызываю функцию Put, программа разрушает. Я думаю, что нет Назовите это хорошим способом. Можете ли вы объяснить, как это назвать?

edit: я отредактировал код, теперь программа показывает мне несколько больших чисел, а затем разбивает. Что я делаю неправильно?

1 Ответ

1 голос
/ 23 марта 2020

Функция IsEmpty должна быть объявлена ​​как

bool IsEmpty( const Queue &q )
{
    return q.head == nullptr;
}

Функция Put недействительна. Головка указателя не устанавливается, когда очередь пуста. Функцию можно определить следующим образом:

void Put( Queue& q, Atom x)
{
    Element *p = new Element { x, nullptr };

    if ( q.head == nullptr )
    {
        q.head = q.tail = p;
    }
    else
    {
        q.tail = q.tail->succ = p;
    }
}

Функция Get должна быть определена, по крайней мере, как

Atom Get(Queue& q)
{
    Element* p = q.head;
    int aux;
    aux = p->info;
    q.head = p->succ;
    if ( q.head == nullptr ) q.tail = nullptr;
    delete(p);
    return aux;
}

И, наконец, в main вы должны написать

Queue q = InitQ();
...