• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lista dwukierunkowa c++

Object Storage Arubacloud
0 głosów
5,068 wizyt
pytanie zadane 27 marca 2017 w C i C++ przez krzakurts Obywatel (1,470 p.)

Witam! Mam pewien problem przy liście dwukierunkowej, którego nie mogę rozwiązać. Wszystko ładnie chodzi, ale jest jeden defekt przy dodawaniu na koniec listy. Bowiem, jak dodaje na końcu listy, to kasuje mi wtedy z listy wszystkie wcześniejsze elementy. Co dziwniejsze, jeśli dodam drugi raz na koniec listy, to wtedy już wszystko działa poprawnie i poprzedni element listy też się tam znajduje. Załączam fragment kodu. Struktury listy, elementu oraz metodę dodawania na końcu. Proszę o pomoc :) 

struct student{
     int numer_albumu;
     string imie;
     string nazwisko;
     int rok_studiow;
     string kierunek;
     string specjalnosc;

     student *nastepny;  // wskaznik na nastepny element
     student *poprzedni;
     student();  // konstruktor

};

student::student(){

nastepny=0;
poprzedni=0;  // konstruktor

}

struct lista{

student *pierwszy; // wskaznik na poczatek listy/pierwszy element
student *ostatni; // wskaznik na koniec listy/pierwszy element
int licznik;
void dodaj_studenta();
void usun_studenta();
void dodaj_studenta2();
int wyszukaj();
void dodaj_kilku_studentow();
void przejrzyj_liste();
void dodaj_studenta_po();
void wyswietl_liste()
{
     student *temp=pierwszy;
     while(temp)
     {
          cout << "numer albumu: " << temp->numer_albumu << " imie: " << temp->imie << "nazwisko: " << temp->nazwisko << "rok studiow: " << temp->rok_studiow << " kierunek: " << temp-> kierunek << "specjalnosc: " << temp-> specjalnosc << endl;
          temp=temp-> nastepny;
     }
}
lista();
};

lista::lista(){
pierwszy=0;
ostatni=0;

}

void lista::dodaj_studenta()
{
      int numer_albumu, rok_studiow, kierunek, specjalnosc;
      string imie, nazwisko;
     student *nowy = new student;


     cout << "Podaj numer albumu studenta: ";
     cin >> nowy -> numer_albumu;
     cout << endl << "Podaj imie studenta: ";
     cin >>  nowy -> imie;
     cout << endl << "Podaj nazwisko studenta: ";
     cin >> nowy -> nazwisko;
     cout << endl << "Podaj rok studiow studenta: ";
     cin >> nowy ->  rok_studiow;
     cout << endl << "Podaj kierunek studiow studenta: ";
     cin >> nowy ->  kierunek;
     cout << endl << "Podaj specjalnosc studiow studenta: ";
     cin >> nowy -> specjalnosc;
     cout << endl;

if(pierwszy==NULL)
     {
          pierwszy = nowy;
     }
     else
     {

student *temp=pierwszy;
nowy -> nastepny=NULL;
nowy -> poprzedni=ostatni;
ostatni=nowy;

if(nowy->poprzedni)
     nowy->poprzedni->nastepny=nowy;
else
     pierwszy=nowy;
     }
}




 

2 odpowiedzi

0 głosów
odpowiedź 27 marca 2017 przez tangarr Mędrzec (154,860 p.)
wybrane 27 marca 2017 przez krzakurts
 
Najlepsza

Podczas dodawania pierwszego elementu nie ustawiasz wskaźnika na ostatni element.
Coś takiego powinno pomóc:
 

if(pierwszy==NULL)
{
    pierwszy = nowy;
    ostatni = nowy;
}
else
{
    nowy -> poprzedni=ostatni;
    ostatni=nowy;
    if(nowy->poprzedni)
        nowy->poprzedni->nastepny=nowy;
}

 

komentarz 27 marca 2017 przez krzakurts Obywatel (1,470 p.)
Faktycznie, działa elegancko. Dziękuję bardzo za pomoc. :)
0 głosów
odpowiedź 27 marca 2017 przez Arkadiusz Sikorski Pasjonat (20,160 p.)

Taka uwaga trochę poza tematem.

Skoro programujesz w C++, to powinieneś zadbać o hermetyczność swojej struktury. Raczej nie chcesz, żeby ktoś niepowołany spoza klasy mógł zmienić wskaźnik na następny lub poprzedni element. W tym wypadku dobrym nawykiem byłoby zmienić dostępność wskaźników "nastepny" i "poprzedni" na "private" w obydwu strukturach (domyślnie wszystkie elementy struktury w C++ są ustawione na "public") i w razie potrzeby użyć odpowiednich deklaracji przyjaźni między klasami.

Pozdrawiam!

Podobne pytania

0 głosów
1 odpowiedź 338 wizyt
0 głosów
1 odpowiedź 814 wizyt
0 głosów
1 odpowiedź 1,578 wizyt
pytanie zadane 2 kwietnia 2017 w C i C++ przez chacken Użytkownik (820 p.)

92,581 zapytań

141,433 odpowiedzi

319,666 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...