Peter_m Temat założony przez niniejszego użytkownika |
Lekcja 45 - Zadanie domowe podpunkt 2 - problem ze zrozumieniem zadania - mile widziane wskazówki. » 2018-04-28 16:09:03 Witam, Mam problem ze zrozumieniem treści zadania, o co chodzi autorowi. O to treść: Zwróć uwagę, że dodajKoniec() używa funkcji ostatni(), a więc dodanie 1001. liczby wymaga przejścia przez 1000 węzłów tylko po to, by znaleźć koniec listy. Znajdź sposób na to, by dodawanie elementów na oba końce listy nie wymagało odwiedzania wszystkich węzłów. Podpowiedź: Możesz potrzebować drugiego struct. O to kod źródlowy programu który należy zmodyfikować/przeanalizować: #include <iostream>
struct Lista { Lista * ogon; int liczba; };
void wypisz( Lista * lista ) { if( lista ) { std::cout << lista->liczba << ", "; wypisz( lista->ogon ); } }
Lista * ostatni( Lista * lista ) { if( lista ) while( lista->ogon ) lista = lista->ogon; return lista; }
void dodajKoniec( Lista *& lista, int liczba ) { Lista * nowy = new Lista; nowy->liczba = liczba; nowy->ogon = nullptr; if( lista ) ostatni( lista )->ogon = nowy; else lista = nowy; }
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 ); }
Czy Autorowi chodzi o listy dwu kierunkowe, czy o coś innego? Mile widziane wskazówki, serdecznie dziękuję za pomoc w rozwiązaniu zadania! Btw, jestem tu nowy, bardzo fajny kurs C++'a |
|
pekfos |
» 2018-04-28 16:18:30 Trudno tu o wskazówkę, która nie będzie bezpośrednio wskazywać sposobu rozwiązania problemu. Zacznijmy od tego, że w żaden sposób nie odniosłeś się do podpowiedzi do zadania. Oraz: dodanie 1001. liczby wymaga przejścia przez 1000 węzłów tylko po to, by znaleźć koniec listy. |
|
|
Peter_m Temat założony przez niniejszego użytkownika |
» 2018-04-28 16:30:50 Bo dopiero zaczynam wykonywać to zadanie, a nie wiem jak się za nie zabrać, wiem natomiast, że będę potrzebował drugiego Struct, który będzie przechowywał wskaźnik początek i koniec. I funkcja wypisz będzie korzystać z początku, a funkcja dodaj koniec z końca. Dobrze myślę? |
|
pekfos |
» 2018-04-28 16:43:13 Tak. Chodzi o to, by mieć jedną strukturę na organizację węzła listy (struktura dana w zadaniu) i drugą na organizację listy jako całości. Wskaźnik na aktualny koniec listy to własność listy jako całości, a nie węzła. |
|
Peter_m Temat założony przez niniejszego użytkownika |
» 2018-04-28 16:50:23 A można prosić o rozpisanie tego w kodzie mniej więcej jak to by wyglądało?, nie chce gotowca, tylko przykład. Bardzo mi to pomoże w rozwiązaniu zadania. Serdecznie dziękuję. |
|
pekfos |
» 2018-04-28 16:57:43 struct Lista { Wezel * poczatek; };
struct Wezel
Dla wygody użycia, niech wszystkie funkcje przyjmują obiekt Lista przez referencję, a sam obiekt niech jest utworzony na stosie, a nie alokowany dynamicznie. Lista lista; utworz( lista );
wypisz( lista ); zniszcz( lista ); Zacznij od przerobienia kodu, by tak wyglądał. Potem dopiero zajmij się optymalizowaniem dodawania elementów na koniec. |
|
Peter_m Temat założony przez niniejszego użytkownika |
» 2018-04-28 17:55:12 Wybacz, Ale nadal nie potrafię sobie tego wyobrazić. kod już mam przygotowany, według wskazówki.
|
|
pekfos |
» 2018-04-28 18:28:49 W tym zestawie funkcji, dodajKoniec() to jedyny sposób, w jaki węzeł może stać się końcem listy. Więc jeśli w tej funkcji zapiszesz sobie gdzieś wskaźnik na ostatni węzeł danej listy, to w następnym wywołaniu nie będziesz musiał go szukać. |
|
« 1 » 2 3 |