#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 );
}
Odczytuje kolejne elementy (więzły) w liście, aż ogon
jakiegoś elementu będzie NULL
- wtedy wiemy że ten element jest ostatni.
Dziękuję , a w jaki sposób analogicznie można ustalić pierwszy element listy?
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.
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
Przeanalizuję to , dziękuję za pomoc. :)
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.