Очередь с использованием класса в C ++ - PullRequest
0 голосов
/ 29 марта 2020

У меня проблема с очередью, с удалением первых элементов. Указатель "nastepca" должен хранить адрес следующей структурной переменной в очереди, но он хранит nullptr для всех данных в структуре, и я не могу это исправить. Я перепробовал много вариантов, но ни один из них не сработал. Правильно ли работает моя очередь, правильно ли она помещает данные, адрес раньше был рядом с адресом? dolacz () - означает add / equeue zdejmij () - означает удаление / удаление кон iec - означает конец

#include <iostream>
#include <string>

using namespace std;
template<typename T>
class Kolejka
{
    struct Element
    {
        T dane;
        Element* nastepca;
        Element(const T& dane, Element* nastepca) : dane(dane), nastepca(nastepca) {}
    };

    Element* start = nullptr; //pusty wskaznik nullptr
    Element* koniec = nullptr; //pusty wskaznik nullptr
    int licz_elementow = 0;

public:
    void dolacz(const T& dane)
    {

        if (start == nullptr) //jezeli kolejka jest pusta to dodaj na poczatek (poczatek i koniec jest ten sam)
        {
            start = new Element(dane, start);
            licz_elementow++;
        }
        else
        {
            ss++;
            koniec = new Element(dane, koniec);
            licz_elementow++;
        }


    }
    void zdejmij() //nie działa
    {
        if (start == koniec)
        {
            start = koniec = nullptr;
            licz_elementow--;
        }
        else
        {
            Element* tmp = start;
            start = start->nastepca;
            delete tmp;
            licz_elementow--;
        }

    }

    T& gora() //zwroci referencje typu T na początek kolejki
    {
        if (koniec == nullptr)
        {
            throw runtime_error("Pusta kolejka!");
        }
        return start->dane;
    }

    T& tyl() //zwroci referencje typu T na koniec kolejki
    {
        if (koniec == nullptr)
        {
            throw runtime_error("Pusta kolejka!");
        }
        return koniec->dane;
    }

    int rozmiar()
    {
        return licz_elementow;
    }

    bool pusty()
    {
        return start == nullptr;
    }

};

class Auto
{
    string marka;
    friend ostream& operator <<(ostream& w, Auto& a);  //zaprzyjaźniona funkcja przeciążająca operator <<
public:
    Auto(string marka): marka(marka) {}
};
ostream& operator <<(ostream& w, Auto& a)
{
    w << a.marka;
    return w;
}
int main()
{
    Kolejka <Auto> kol;
    try
    {
        kol.dolacz(Auto("aaa"));
        kol.dolacz(Auto("bbb"));
        kol.dolacz(Auto("ccc"));
        kol.dolacz(Auto("ddd"));
        kol.zdejmij();
        cout << "Liczba elementow: ";
        cout << kol.rozmiar();
        cout << endl;
        cout << "Poczatek kolejki: ";
        cout << kol.gora();
        cout << endl;
        cout << "Koniec kolejki: ";
        cout << kol.tyl();




    }
    catch (runtime_error& BLAD)
    {
        cout << BLAD.what();
    }


}

введите описание изображения здесь При отладке: nastepca всегда иметь 0x00000000

1 Ответ

0 голосов
/ 29 марта 2020
start = new Element(dane, start);

должно быть

start = koniec = new Element(dane, nullptr);

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

koniec = new Element(dane, koniec);

должно быть

Element* temp = new Element(dane, nullptr);
koniec->nastepca = temp;
koniec = temp;

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

Операции с указателями сложны, вы должны тщательно подумать о том, что вы действительно делаете. Это может помочь нарисовать диаграммы операций, которые вы кодировали. Таким образом, вы бы быстро увидели, что то, что вы закодировали, было неправильно.

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