Cześć!
Mam za zadanie napisać program operujący na liście cyklicznej. Wszystko szło dobrze ale zatrzymałem się na funkcji, która ma usuwać wszystkie elementy. Możliwe, że czegoś nie rozumiem z przepinaniem elementów podczas usuwania. Po wywołaniu funkcji usun_liste program się crashuje. Proszę o wytłumaczenie jak to powinno wyglądać oraz gdzie tkwi błąd. Z góry dzięki za pomoc!
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
struct element
{
element *poprz;
int dane;
element *nast;
};
void wyswietl_liste(element* wsk) {
element *pom;
int i =1;
pom = wsk;
system("CLS");
if (pom == NULL) cout << "Lista jest pusta...\n";
else {
cout << "Nr elementu Element listy\n";
do
{
cout << "\t" << i << "\t\t" << pom->dane << "\n";
pom = pom->nast;
i++;
} while (pom != wsk);
}
system("PAUSE");
return;
}
void dodaj_el(element* (&wsk)) {
int i;
element *pom;
pom = new element;
system("CLS");
cout << "Podaj liczbe calkowita: "; cin >> i;
pom->dane = i;
if (wsk == NULL)
{
pom->poprz = pom;
pom->nast = pom;
wsk = pom;
}
else
{
pom->nast = wsk->nast;
wsk->nast->poprz = pom;
wsk->nast = pom;
pom->poprz = wsk;
wsk = pom;
}
}
void usun_el(element* (&wsk)) {
if(wsk == NULL) return;
if(wsk->nast == wsk)
{
delete wsk;
wsk = NULL;
}
else
{
element *pom;
pom = wsk;
wsk->poprz->nast = wsk->nast;
wsk->nast->poprz = wsk->poprz;
wsk = wsk->nast;
delete pom;
}
}
void usun_liste(element* (&wsk)) {
element *pom;
while (wsk!=NULL) {
pom=wsk;
wsk=wsk->nast;
delete pom;
}
}
void odczytaj_plik(element *(&wsk))
{
char odp;
if(wsk != NULL)
{
system("PAUSE");
cout<<"Lista zawiera elementy. Czy chcesz ja usunac? (t/n)?";
cin>>odp;
if (odp=='n') return;
}
if (wsk != NULL) usun_liste(wsk);
fstream plik;
element *pom;
plik.open("liczby.rob", ios::in);
while (!plik.eof())
{
pom = new element;
plik >> pom->dane;
if (wsk == NULL)
{
pom->nast = pom;
pom->poprz = pom;
wsk = pom;
}
else
{
pom->nast = wsk->nast;
wsk->nast->poprz = pom;
wsk->nast = pom;
pom->poprz = wsk;
wsk = pom;
}
}
plik.close();
}
int main() {
char w='p';
element* wsk_l;
wsk_l = NULL;
do {
system("CLS");
cout<<"\n1. Wyswietl liste - 1";
cout<<"\n2. Dodaj element - 2";
cout<<"\n3. Usun element - 3";
cout<<"\n4. Odczytaj listê z pliku - 4";
cout<<"\n5. Koniec - 5\n\n";
cin >> w;
switch (w) {
case '1' : wyswietl_liste(wsk_l);
break;
case '2' : dodaj_el(wsk_l);
break;
case '3' : usun_el(wsk_l);
break;
case '4' : odczytaj_plik(wsk_l);
break;
}
} while (w!='5');
usun_liste(wsk_l);
return 0;
}