Zwróć uwagę że wskaźnik lista z maina, który jest przekazywany do wszystkich funkcji to tak na prawdę początek listy. Wystarczy dodać wskaźnik który będzie trzymał koniec listy. Z kolejna struktura chyba chodzi im o stworzenie struktury, ktora będzie miec dwa wskazniki do listy - poczatek i koniec listy. Ją bedziesz wysylal do funkcji i funkcja dodaj koniec skoezysta ze wskaznika do konca listy a funkcja wypisz tak jak jest - z wsk do początku listy.
EDIT:
Najprostsze rozwiązanie problemu przechodzenia przez wszystkie węzły, żeby dodać element na koniec to pamiętanie wskaźnika na koniec listy. Oto najprostsza implementacja:
#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);
}
}
// Dodaj element na koniec listy
void dodajKoniec(Lista *& lista, Lista *& koniec, int liczba)
{
// Tworzymy nowy element listy
Lista * nowy = new Lista;
nowy->liczba = liczba;
nowy->ogon = nullptr;
// Dopisujemy na koniec
if (lista)
koniec->ogon = nowy;
else
lista = nowy;
koniec = nowy;
//trzeba uaktualnic wskaznik koniec, dodalismy na koniec
//wiec jes to banalne :P
}
// 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;
//najprostsze rozwiazanie problemu przechodzenia po wszystkich wezlach
//przy dodaniu na koniec to oczywiscie dodanie wskaznika na koniec
Lista * koniec = nullptr;
std::cout << "Podaj liczby, 0 lub blad konczy:\n";
while (std::cin >> liczba && liczba)
dodajKoniec(lista, koniec, liczba);
std::cout << "Koniec, oto liczby:\n";
wypisz(lista);
zniszcz(lista);
}
Wszystko działa, ale chcemy to napisać ładniej. Wskaznik lista i koniec nie są ze sobą w żaden sposób powiązane. Nie łączy ich nic, a powinno bo razem tworzą naszą listę. To jest brzydkie, bo gdybyśmy musieli korzystać z kilku list w mainie, to musielibyśmy łączyć te dwa wskaźniki przy pomocy nazewnictwa w stylu lista1, koniec1, lista2, koniec2 ... A to jest brzydkie, oczywiscie mozna by je do tablicy wrzucić, ale i tak musiałyby być dwie tablice. Dodajemy zatem strukture, która połączy te dwa wskaźniki.
#include <iostream>
//nie podoba mi sie ta nazwa, to sie powinno nazywac Lista,
//ale ze ktos nazwał w ten sposób strukture, ktora powinna nazywac sie
//wierzcholek albo wezel wiec nic nie poradze
struct WspolrzedneListy
{
Lista* poczatek;
Lista* koniec;
};
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);
}
}
// Dodaj element na koniec listy
void dodajKoniec(Lista *& lista, Lista *& koniec, int liczba)
{
// Tworzymy nowy element listy
Lista * nowy = new Lista;
nowy->liczba = liczba;
nowy->ogon = nullptr;
// Dopisujemy na koniec
if (lista)
koniec->ogon = nowy;
else
lista = nowy;
koniec = nowy;
//trzeba uaktualnic wskaznik koniec, dodalismy na koniec
//wiec jes to banalne :P
}
// Usuwa listę
void zniszcz(Lista *& lista)
{
while (lista)
{
Lista * tmp = lista;
lista = lista->ogon;
delete tmp;
}
lista = nullptr;
}
int main()
{
int liczba;
WspolrzedneListy lista = { nullptr, nullptr };
std::cout << "Podaj liczby, 0 lub blad konczy:\n";
while (std::cin >> liczba && liczba)
dodajKoniec(lista.poczatek, lista.koniec, liczba);
std::cout << "Koniec, oto liczby:\n";
wypisz(lista.poczatek);
zniszcz(lista.poczatek);
}
Oczywiście zamiast wysylać do funkcji wskaźniki do listy moglibyśmy przesłać referencje do tej nowej struktury i w funkcjach wyciagac sobie wskaźniki, które akurat są nam potrzebne (poczatek lub koniec). To kwestia wyboru. Ale to dalej jest brzydkie jak dla mnie. Jeśli już piszemy w języku obiektowym jakim jest C++ to możemy zastosować podejście obiektowe i połączyć zachowanie (funkcje) ze stanem (zmiennymi) w postaci metod, składowych oraz modyfikatorów dostępu. Można by też wrzucić strukture lista do środka klasy. Nie wiem czy przerabiałeś już takie rzeczy, więc sobie odpuszcze.