No wlasnie, mam jakas tam lste jednokierunkowa, jak usunac ja z pamieci.
Zdaje sie mi zeby dostac sie do przedostatniego elementu i skasowac ostani i tak dalej, ale jak sie do tego przedostatniego dostac?
Nie wiem jak twoja lista jest zbudowana ale zakładając że jest ona w klasie i ma nastepujące metody:
void UstawWskaznikNaPierwszyElement();
boolean KasujAktualnyElement();
boolean CzyElementJestPrawidlowy();//czyli inaczej jesli jest rozny od NULL
Możnaby zawrzeć to w następującym kodzie
for(lista.UstawWskaznikNaPierwszyElement;lista.CzyElementJestPrawidlowy();lista.KasujAktualnyElement()) ;
i to by usunęło całą listę :P
Chyba zrozumiałeś o co mi chodzi, jeśli nie to napisz dam szerszy opis :P
Mam mgliste pojecie o co Ci chodzi, wiec jakbys to mogl dokladniej wyjasnic bylbym wdzieczny.
Aha i lista nie jest w klasie :( ;].
Dzieki.
klajter napisał(a)
Mam mgliste pojecie o co Ci chodzi, wiec jakbys to mogl dokladniej wyjasnic bylbym wdzieczny.
Aha i lista nie jest w klasie :( ;].
Dzieki.
ok wklej kod tej listy czy cokolwiek :P
struct Dane {
char imie[10];
char nazwisko[20];
struct Dane *nast,*poprz;
}*pierwszy,*bierzacy;
int OtwZPlk()
{
//blebleble
}
int ZapiszDoPliku()
{
//blebleble
}
int CreateNew()
{
Dane *tmp;
cout<<"Podaj nazwe bazy:\n >";
cin>>baza.name;
if (baza.name=='q') return 0;
pierwszy=new struct Dane;
pierwszy->poprz=NULL;
bierzacy=pierwszy;
while (WpiszDane(bierzacy)==0){
bierzacy->nast=new struct Dane;
if (bierzacy->nast==NULL) return 1;
tmp=bierzacy;
bierzacy=bierzacy->nast;
bierzacy->nast=NULL;
bierzacy->poprz=tmp;
tmp=NULL;
}
return 0;
}
int WpiszDane (Dane *dane)
{
//bleblebel
}
int WypiszDane(Dane *baza)
{
// wypisuje blebleble
}
/* Ponizsza funkcja powinna kasowac liste ale nie dziala :P
Raz sie wysypuje na while'u a innym razem na delete
Prawdopodobnie cala funkcja jest zla
*/
bool CzyscListe(Dane *lista)
{
if (lista==NULL) return true;
if (lista->nast=NULL) return false;
while ((lista->nast)!=NULL) lista=lista->nast;
lista=lista->poprz;
delete lista->nast;
lista->nast=NULL;
CzyscListe(lista);
return true;
}
A i zrobilem z tej jednokierunkowej dwukierunkowa ;]
Nie chciało mi się tego analizować ale żuciłem okiem i zobaczyłem to:
if (lista->nast=NULL) return false;
Co jak co ale ten warunek zawsze jest spełniony :] nie wiem czy to o to chodzi bo jak mówiłem nie analizowałem tego ale to jest jeden z błędów...
Ale po co kasowac ostatni ? Albo inaczej, czy kasując od pierwszego nie usuniesz listy ? :>
int CzyscListe(Dane* lista){ // int == bool, nie mnóż bytów ponad potrzebę
while(lista->poprz)lista=lista->poprz; // na poczatek
while(lista){
Dane* p=lista;
lista=lista->nast;
delete p;
}
return 1; // true==1
}
//prosciej nie potrafiłem zapisać :)
A i jeszcze jedno.. powinieneś przypisać wartośc 0 (NULL) liscie po jej zwolnieniu... a ta funkcja tego nie robi... wiec może tak :
int CzyscListe(Dane** lista){
while((*lista)->poprz)*lista=(*lista)->poprz;
while(*lista){
Dane* p=*lista;
*lista=(*lista)->nast;
delete p;
}
return 1;
}
// wywołanie CzyscListe(&lista);
// albo tak:
int CzyscListe(Dane*& lista){
while(lista->poprz)lista=lista->poprz;
while(lista){
Dane* p=lista;
lista=lista->nast;
delete p;
}
return 1;
}
// wywołanie CzyscListe(lista);
Przy liscie jednokierunkowej nie musiałbys/mógłbyś sie przesuwać do poczatku, odpadłaby pierwsza pętla, taka różnica.
doqro8ej napisał(a)
Ale po co kasowac ostatni ? Albo inaczej, czy kasując od pierwszego nie usuniesz listy ? :>
No wlasnie wpdalem na to dzisiaj rano :), nie ma to jak sie przespac z problemem.
Dzieki za pomoc.
zapominałem o jedny,,, wewnątrz funkcji wstaw if'a (na obie albo pierwszą pętle)
if(lista){ // przy pierwszej i trzeciej wersji
}
if(*lista){ // dla drugiej
}
Bo sie program popier*oli ;]
a tak w ogóle, to nie jest lista jednokierunkowa :]