oriv Temat założony przez niniejszego użytkownika |
R. 45 - zadanie domowe - ppkt b » 2019-06-28 23:01:47 Witam, fajny i wciągający kurs cpp .. aż do R. 45 dawałem rade sam, jednak zadanie 45 b, mnie już przerosło.. Pytanie: czy w funkcji main jest konieczna zmiana następującego fragmentu kodu by je poprawnie rozwiązać?
while( std::cin >> liczba && liczba ) dodajKoniec( lista, liczba );
Z góry dziękuje za podpowiedzi.. |
|
pekfos |
» 2019-06-28 23:14:03 Da się wykonać zadanie modyfikując tylko tą linię w funkcji main(): 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 ); } gdzie przez modyfikację rozumiem wyrzucenie tej linii i napisanie tam czegoś innego, potencjalnie więcej niż jednej linii. Oczywiście pozostałe funkcje trzeba też jakoś zmodyfikować. |
|
oriv Temat założony przez niniejszego użytkownika |
» 2019-06-29 15:35:50 Wskazówka do zadania sugeruje "Podpowiedź: Możesz potrzebować drugiego struct.", oznacza to wiec ze będę potrzebować również nowego obiektu na nowa structure np.: struct Wezel { Wezel * ogon; int liczba; }; struct Lista { Wezel * poczatek; Wezel * koniec; };
dla struct Wezel np. wezel(nowy-z przykładu) oraz dla struct Lista np. lista ? |
|
pekfos |
» 2019-06-30 19:56:45 Jakie ma znaczenie, czego jeszcze będziesz potrzebować? Jak będziesz potrzebować, to użyj. |
|
oriv Temat założony przez niniejszego użytkownika |
» 2019-06-30 22:04:48 w sumie to już nic wiem, chyba nie końca opanowałem wskaźniki lub nie zrozumiałem autora o co chodzi w tym zadaniu. Kombinuje na rożne sposoby i nic nie wychodzi poza błędami konwersji itd. Dzięki pekfos za fatygę ale nie chce cie więcej wkurzać moją niewiedzą. |
|
pekfos |
» 2019-06-30 22:30:06 Jak masz problem z konkretnym rozwiązaniem, to podaj to co masz. Znacznie łatwiej pomóc przy problemie, niż odpowiedzieć na niejasne pytanie, które z problemu w jakiś sposób wynika. |
|
oriv Temat założony przez niniejszego użytkownika |
» 2019-07-02 22:59:06 #include <iostream>
struct Wezel { Wezel * ogon; int liczba; }; struct Lista { Wezel * poczatek; Wezel * koniec; };
void utworz( Lista & lista ) { lista.poczatek = NULL; lista.koniec = NULL; }
void wypisz( Lista & lista ) { std::cout << lista.poczatek << ", "; std::cout << lista.koniec << ", "; }
void dodajKoniec( Lista & lista, Wezel *& wezel, int liczba ) { wezel->liczba = liczba; wezel->ogon = lista.poczatek; if( lista.poczatek ) { lista.koniec = wezel; lista.poczatek = wezel->ogon; } else lista.poczatek = wezel; }
void zniszcz( Lista & lista ) { while( & lista ) { Wezel * tmp = lista.poczatek; delete tmp; Wezel * tmp1 = lista.koniec; delete tmp1; } lista.poczatek = NULL; lista.koniec = NULL; } int main() { int liczba; Lista lista; Wezel * wezel = NULL; utworz( lista ); std::cout << "Podaj liczby, 0 lub blad konczy:\n"; while( std::cin >> liczba && liczba ) dodajKoniec( lista, wezel, liczba ); std::cout << "Koniec, oto liczby:\n"; wypisz( lista ); zniszcz( lista ); }
Mile widziane wskazówki i sugestie...bez dobrego mentora tego nie łyknę... Jestem odporny na krytykę... |
|
pekfos |
» 2019-07-02 23:49:23 1.Problem - Nie wiem czy program ma wypisać wszystkie wpisane liczby czy tylko 1 i ostatnia? |
Dlaczego miałoby się to zmienić? Wcześniej były wypisywane wszystkie. void dodajKoniec( Lista & lista, Wezel *& wezel, int liczba ) { wezel->liczba = liczba; wezel->ogon = lista.poczatek;
|
Dlaczego nie dynamicznie? W tym kodzie nie ma ani jednej alokacji, a masz dealokacje. wezel jest na start pustym wskaźnikiem, więc te przypisania są błędne. Gdzieś po drodze straciłeś całkiem funkcjonalność listy. Węzły powinny być alokowane dynamicznie. Argument wezel jest niepotrzebny, jego rolę przejmuje argument lista. void zniszcz( Lista & lista ) { while( & lista ) { Wezel * tmp = lista.poczatek; delete tmp; Wezel * tmp1 = lista.koniec; delete tmp1; } lista.poczatek = NULL; lista.koniec = NULL; }
|
Usuwanie dotyczy tylko dynamicznie zaalokowanej pamięci, która musi być zwolniona dokładnie raz, niezależnie od ilości wskaźników, które na nią wskazują. Wskaźnik na początek jest wystarczający do zniszczenia listy, a wskaźnik na koniec jest stricte pomocniczy, wystarczy że go wyzerujesz. Pamiętaj też że lista nie jest już wskaźnikiem na węzeł listy, więc pętla iterująca po liście musi ulec zmianie. Warunek &lista jest tu niewłaściwy, bo jest zawsze prawdziwy. Te zmienne tmp nie są tu potrzebne, wystarczy delete lista.poczatek. |
|
« 1 » 2 |