Kasowanie listy jednokierunkowej

0

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?

0

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

0

Mam mgliste pojecie o co Ci chodzi, wiec jakbys to mogl dokladniej wyjasnic bylbym wdzieczny.
Aha i lista nie jest w klasie :( ;].
Dzieki.

0
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

0


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 ;]

0

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...

0

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.

0
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.

0

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 ;]

0

a tak w ogóle, to nie jest lista jednokierunkowa :]

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