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, botów: 0