Kolejka - wyświetlanie

0

Witam, na wstępie zaznaczam,że przeszukanie forum nic mi nie dało, gdyż nie znalazłem podobnego problemu.
Próbuję zaimplementować samodzielnie kolejkę. Niestety nie działa mi funkcja wyświetlająca, tzn. wyświetla liczby umieszczone w kolejce w nieskończoność. Kod:

class Kolejka {
    struct Wezel {
        Wezel* nast;
        int wartosc;
    };
    Wezel* ogon;

public:
    Kolejka();
    ~Kolejka(); // itd.
}

I dalej :

void Kolejka::wyswietl()
{
    Wezel* wsk = ogon;
    cout < endl << endl << "\t\t"
                << "kolejka :" << endl;
    while (wsk) {
        cout << wsk->wartosc;

        wsk = wsk->nast;
    }
    if (!wsk)
        cout < endl << "Kolejka pusta" << endl;
}

Wie ktoś może, gdzie leży problem? Z góry dziękuję.

0

Problem najprawdopodobniej nie leży w wyswietl().

0

Może chodzi o linijkę

 wsk=wsk->nast;

? Bo w sumie skoro wskaźnik jest ustawiony na ostatni element, to może powinno być zamiast ustawienia na następny element ustawienie na poprzedni? Nie mam jednak w ogóle pomysłu jak można by to zrealizować...

Kod:

#include <iostream>
#include <cstdlib>
using namespace std;
class Kolejka {
    struct Wezel {
        Wezel* nast;
        int wartosc;
        void wypisz()
        {
            cout << "\t" << wartosc;
        }
    };
    Wezel* ogon, *glowa;

public:
    Kolejka();
    ~Kolejka();
    void dodaj(int elem);
    void wypisz2();
    void usun_pierwszy();
    void usun_wszystkie();
    void wyswietl();
    int pierwszy();
};

Kolejka::Kolejka()
{
    ogon = NULL;
    glowa = NULL;
}
Kolejka::~Kolejka() {}
void Kolejka::dodaj(int elem)
{
    Wezel* wsk = new Wezel;
    wsk->wartosc = elem;
    if (ogon) {
        wsk->nast = ogon->nast;
        ogon->nast = wsk;
    } else
        wsk->nast = wsk;
    ogon = wsk;
}

void Kolejka::wyswietl()
{
    Wezel* wsk = ogon;
    cout << endl << endl << "\t\t"
         << "Kolejka :" << endl << endl;
    while (wsk) {
        cout << wsk->wartosc;

        wsk = wsk->nast;
    }
    if (!wsk)
        cout << endl << "Kolejka pusta" << endl;
}
void Kolejka::usun_pierwszy()
{
    if (ogon) {
        Wezel* wsk = ogon->nast;
        if (wsk->nast != wsk)
            ogon->nast = wsk->nast;
        else
            ogon = NULL;
        delete wsk;
    }
}
void Kolejka::usun_wszystkie()
{
    Wezel* wsk = ogon;
    while (wsk != NULL) {
        wsk = ogon->nast;
        delete ogon;
        ogon = wsk;
    }
}
int main()
{
    Kolejka kol;
    int liczba;
    cout << endl << "Podaj 5 liczb, które chcesz umiescic w kolejce:" << endl;
    for (int i = 1; i <= 5; ++i) {
        cin >> liczba;
        kol.dodaj(liczba);
    }
    kol.usun_pierwszy();
    kol.wyswietl();
    kol.usun_wszystkie();

    system("PAUSE");
    return 0;
}

Program wyświetla w nieskończoność elementy znajdujące się w kolejce. To, co jest w mainie po

 wyswietl() 

już się nie wykonuje.

0
  1. Przecież w dodaj() robisz sobie kolejkę cykliczną, no to potem oczywiście będzie chodzić w nieskończoność.
  2. Po co jest glowa? Nigdzie z niej nie korzystasz.
  3. Jaki jest sens zacząć wyświetlanie od ogona, skoro to jest ostatni element (gdyby kolejka nie była cykliczna)?
0
  1. Który konkretnie fragment wskazuje na to,że jest to kolejka cykliczna? Chodzi o if'a w tej metodzie?
    2)Glowa jest tam przez przypadek, to jakaś pozostałość po poprzedniej implementacji.
  2. No nie ma to sensu, ale nigdzie nie mam wskaźnika na pierwszy element, od którego można zacząć wyświetlanie.
1
Bylo_Minelo napisał(a):

2)Glowa jest tam przez przypadek, to jakaś pozostałość po poprzedniej implementacji.
3) No nie ma to sensu, ale nigdzie nie mam wskaźnika na pierwszy element, od którego można zacząć wyświetlanie.
Można zacząć używać glowy.

  1. Który konkretnie fragment wskazuje na to,że jest to kolejka cykliczna? Chodzi o if'a w tej metodzie?
    Jeśli ogon == NULL to masz
wsk->nast = wsk;
ogon = wsk;

czyli ogon->nast == ogon - jednoelementowy cykl.

Jeśli ogon != NULL:

wsk->nast = ogon->nast;     // pamietajmy, ze  ogon->nast == ogon
ogon->nast = wsk;               //  wsk->nast == ogon  && ogon->nast == wsk
ogon = wsk;

1 użytkowników online, w tym zalogowanych: 0, gości: 1