Jednokierunkowa lista LIFO

0

Moze mi ktos wytlumaczyc jak zrobic jednokierunkowa liste? Czytalem duzo w google nic nie mogle znaleŹĆ, same dlugie kody w ogóle nie do zrozumienia dla poczatkujacego. Znam zasade dzialania listy tylko moj problem jest taki ze nie umiem tego napisac. Prosze mi podac jakis krotki przyklad(code). Ale najpierw napisze co juz umiem, tak bedziecie wiedziec gdzie moj problem tkwi.

LIFO (last-in, firs-out)

struct Element{
                int liczba;
                Element * next;
                }
Element * top;

void addelement(int liczba1){
                    Element *pointer = new Element;
                    pointer->liczba = liczba1
                    pointer->next=NULL //pierwszy element musi pokazywac na NULL (koniec listy)
                   // co musze zrobic zeby na koncu listy byl next = NULL ?
                    top= pointer // first pointer bedzie sie przesowal razem z dodaniem nowego elementu
                                         //first otrzymuje rowniez adres od pointer poniewaz po wyjsciu z funkji      pointer nie bedzie egzystowac.
                    }

int main(int argc, char *argv[])
{
    int liczba1;
    Element s1
    s1.addelement(liczba1);
}

dzieki za odpowiedz !

0

Raz, LIFO to nie lista, tylko stos.
Dwa, element który dodajesz ma wskazywać na element poprzedni, więc nie next=NULL tylko next=top.
A więc twój kodzik powinien wyglądać bardziej tak:

struct Element{
  int liczba;
  Element * next;
};
Element * top=NULL; // dla pewności

void addelement(int liczba1){
  Element *pointer = new Element;
  pointer->liczba = liczba1;
  pointer->next=top; //pierwszy element musi pokazywac na NULL (koniec listy) - tak ale to nie jest pierwszy tylko ostatni element
  // co musze zrobic zeby na koncu listy byl next = NULL ?
  top= pointer; // first pointer bedzie sie przesowal razem z dodaniem nowego elementu - i prawidłowo
}

int main(int argc, char *argv[])
{
  int liczba1;
  //s1.addelement(liczba1); // a co to ma być??? addelement nie jest zaprzyjaźnione, więc nie możesz tego tak użyć
  addelement(liczba1);
}
0

To się robi raczej tak:

Element* pierwszy=NULL; //dla pustej listy wskazujemy na NULL

a potem w dodawaniu masz tylko (oczywiście wysyłasz do tej funkcji też wskaźnik na pierwszy element!, nie tylko dane do wpisania do nowego elementu!):
funkcja powinna byc bool żeby wiedzieć czy sie powiodła

Element* tmp=new Element; //stworzenie nowego elementu
if (tmp==NULL) return false; //alokacja sie nie powiodla
tmp->liczba=liczba1;
tmp->next=pierwszy; //element ktory byl pierwszy bedzie drugi
pierwszy=tmp; //nasz nowy element bedzie pierwszy
return true; //bo sie powiodlo
0

Dzieki za wasza szybka odpowiedz!
Moj problem byl taki ze nie mogle dla ostatniego elementu dolaczyc next = NULL, ale teraz juz wiem. Najpierw byl top=NULL przydzielony next = top, przejal wartosc NULL a pozniej top otrzymuje adres elementu, nawet sam kod napisalem ale teraz mi dales do zrozumienia jak to dziala :) z tym incydentem w main s1.addelement() sam sobie zadaje pytanie dlaczego to tak zrobilem, tak jest jak sie na szybko pisze cos.

Shalom
Masz tez racje, ze musze do funkcji wyslac adres Element * first, bo jezeli tego nie zrobie to nie bede wiedziec gdzie jest moj poczatek, a pointer, ktory jest deklarowany w funkcji zostaje zniszczony po wyjsciu z funkcji. [???] Ale jak by nie bylo to jest top i on mi pokazuje ostatni dodany element ??
[???] W tej funkcji bool, gdzie jest testowane czy alokacja sie powiodla, czyli jezeli jest false to sie nie powiodlo i automatycznie element nie zostanie dodany??

0

No jak zrobisz wskaźnik na 1 element globalną zmienną to oczywiscie nie ma problemu, ale jeśli nie, to musisz go przekazać do funkcji.
Teraz już sam nie wiem czy new zwroci adres NULL przy niepowodzeniu ;] Bo myślałem że tak (tak jak malloc()) ale gdzieś wyczytałem właśnie że jednak nie (trzeba zakazać mu rzucać wyjątek wczesniej), więc cięzko powiedzieć.
Zakładając że jednak zwróci adres NULL jeśli nie udała sie alokacja to oznacza to ze brakuje pamięci i element nie został stworzony.

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