Proszę o wytłumaczenie tego w jaki sposób program ustala ostatni element listy.

0
#include <iostream>

struct Lista
{
    Lista * ogon;
    int liczba;
};

// Wypisz wszystkie elementy listy
void wypisz( Lista * lista )
{
    // Przechodzenie po liście *rekurencyjnie*
    if( lista )
    {
        std::cout << lista->liczba << ", ";
        wypisz( lista->ogon );
    }
}


// Zwróć: wskaźnik na ostatni element listy
Lista * ostatni( Lista * lista )
{
    // Przechodzenie po liście *iteracyjnie*
    if( lista )
    while( lista->ogon )
         lista = lista->ogon;
   
    return lista;
}


// Dodaj element na koniec listy
void dodajKoniec( Lista *& lista, int liczba )
{
    // Tworzymy nowy element listy
    Lista * nowy = new Lista;
    nowy->liczba = liczba;
    nowy->ogon = nullptr;
   
    // Dopisujemy na koniec
    if( lista )
         ostatni( lista )->ogon = nowy;
    else
         lista = nowy;
   
}


// Usuwa listę
void zniszcz( Lista *& lista )
{
    while( lista )
    {
        Lista * tmp = lista;
        lista = lista->ogon;
        delete tmp;
    }
   
    lista = nullptr;
}


int main()
{
    int liczba;
    Lista * lista = nullptr;
    std::cout << "Podaj liczby, 0 lub blad konczy:\n";
   
    while( std::cin >> liczba && liczba )
         dodajKoniec( lista, liczba );
   
    std::cout << "Koniec, oto liczby:\n";
    wypisz( lista );
    zniszcz( lista );
}
2

Odczytuje kolejne elementy (więzły) w liście, aż ogon jakiegoś elementu będzie NULL - wtedy wiemy że ten element jest ostatni.

0

Dziękuję , a w jaki sposób analogicznie można ustalić pierwszy element listy?

1

@Magdalena Hanus:

Nabyłaś / pozyskałaś i autor nie wytłumaczył ?

tworca widzę trącił elementy C++ (znak referencji), ale nie rozumiał istoty.
Po pierwsze nazwa klasy / struktury jest fałszywa, ale po uporzadkowaniu na coś w rodzaju "element listy" bardzo dobre by były metody, a nie pokrętne funkcje w typie C.

2
Magdalena Hanus napisał(a):

Dziękuję , a w jaki sposób analogicznie można ustalić pierwszy element listy?

while( std::cin >> liczba && liczba )
     dodajKoniec( lista, liczba );

std::cout << "Koniec, oto liczby:\n";
std::cout << lista->liczba; // to jest pierwszy element
0

Przeanalizuję to , dziękuję za pomoc. :)

2

Zacznijmy od tego, że nazwa struktury jest błędna. Nie powinna się nazywać Lista tylko bardziej Wezel (po angielsku Node). Powinno być coś w tym stylu:

struct Wezel {
    int liczba;
    Wezel* next;
};

struct Lista {
    Wezel* glowa;
    Wezel* ogon; // <- bez tego można się obejść
};

Gdyby lista zawierała pole ogon to ustalenie ostatniego elementu jest proste bo wystarczy odwołać się do mojalista.ogon. Jak nie takiego pola to trzeba zacząć od glowa i w pętli szukać takiego węzła którego pole next jest nullem.

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