Peter_m Temat założony przez niniejszego użytkownika |
» 2018-04-29 10:27:20 Czyli sugerujesz, że też źle zrobiłem podpunkt 1 z funkcją void dodajpoacztek? |
|
pekfos |
» 2018-04-29 12:03:38 Zależy co to znaczy źle. Kod działa, ale można mieć wątpliwości, czy wiedziałeś co robisz. |
|
Peter_m Temat założony przez niniejszego użytkownika |
» 2018-04-29 12:48:04 Musiałem doczytać z innych źródeł i z wiedzy zawartej w lekcji 45. Nie mniej jednak udało się, działa. Natomiast muszę doczytać jak rozwiązać problem z podpunktu 2, przetrawić to, mam nadzieję, że znowu powiedzie.
Serdecznie dziękuję za cierpliwość nade mną, fakt ta lekcja wymaga większej uwagi i skupienia (przynajmniej ja to tak odbieram)
|
|
Chowan |
» 2018-04-29 20:19:33 masz dodać strukturę, bądź w obecnej dodać wskaźniki do pierwszego i ostatniego węzła i przy dodawaniu kolejnych elementów aktualizować te wskaźniki. |
|
Peter_m Temat założony przez niniejszego użytkownika |
» 2018-04-29 20:44:56 Ok, poczyniłem coś takiego: struct Lista { Lista * ogon; int liczba; }; struct Wezel { Lista * lista; Lista * ostatni; };
void utworz( Wezel *& lista, int liczba ) { Lista * nowy = new Lista; if( nowy ) { if( lista->lista == NULL ) { nowy->liczba = liczba; nowy->ogon = NULL; lista->lista = lista->ostatni = nowy; } else { nowy->liczba = liczba; nowy->ogon = NULL; lista->ostatni->ogon = nowy; lista->ostatni = nowy; } } } void wypisz( Lista * lista ) { if( lista ) { cout << lista->liczba << ", "; wypisz( lista->ogon ); } }
Lista * ostatni( Lista * lista ) { if( lista ) while( lista->ogon ) lista = lista->ogon; return lista; }
void dodajPoczatek( Lista *& lista, int liczba ) { Lista * NewTab = new Lista; NewTab->liczba = liczba; NewTab->ogon = lista; if( NewTab == NULL ) ostatni( lista )->ogon = NewTab; else lista = NewTab; }
void dodajKoniec( Lista *& lista, int liczba ) { Lista * nowy = new Lista; nowy->liczba = liczba; nowy->ogon = NULL; if( lista ) ostatni( lista )->ogon = nowy; else lista = nowy; }
void zniszcz( Lista *& lista ) { while( lista ) { Lista * tmp = lista; lista = lista->ogon; delete tmp; } lista = NULL; } int main() { int liczba; Lista * lista = NULL; cout << "Podaj liczby, o lub blad konczy: \n"; while( cin >> liczba && liczba ) dodajKoniec( lista, liczba ); cout << "Koniec, o to liczby: \n" << endl; utworz( lista ); wypisz( lista ); zniszcz( lista ); return 0; }
||=== Build file: "no target" in "no project"( compiler: unknown ) === | E:\k urs\kurs.cpp | 282 | warning : "/*" within comment[ - Wcomment ] | E:\k urs\kurs.cpp | 291 | warning : "/*" within comment[ - Wcomment ] | E:\k urs\kurs.cpp || In function 'int main()':| E:\k urs\kurs.cpp | 1347 | error : invalid initialization of reference of type 'Wezel*&' from expression of type 'Lista*' | E:\k urs\kurs.cpp | 1256 | note : in passing argument 1 of 'void utworz(Wezel*&, int)' | ||=== Build failed : 1 error( s ) , 2 warning( s )( 0 minute( s ), 0 second( s ) ) === | jednak kompilator zwraca błąd. Gdzie znowu popełniam błąd? |
|
Chowan |
» 2018-04-29 21:19:37 to co masz napisane w komunikacie, funkcja utworz przyjmuje jako pierwszy argument wskaźnik typu Wezel a ty dałeś tam wskaźnik typu Lista, nie wiem po co jest ta funkcja wgle. Masz też tą strukture Wezel a nie aktualizujesz jej, ani nie korzystasz z niej przy dodawaniu kolejnych elementów.
btw @pekfos poprawił Ci funkcje z dodawaniem elementu na początek, ale chyba nie wziąłeś do serca jego uwag. |
|
Peter_m Temat założony przez niniejszego użytkownika |
» 2018-04-29 21:37:47 Funkcję, dodaj poczatek poprawiłem, tylko wstawiłem nie ten kod. Nie chcę spamować niepotrzebnie. Dlatego sam rozumiesz.
|
|
Peter_m Temat założony przez niniejszego użytkownika |
» 2018-04-30 00:12:10 Zadziałało. A więc, faktycznie... jak na spokojnie przysiadłem do tego zadania, to tak jasne uświadomiłem sobie, że brałem to brzydko mówiąc od dupy strony, oraz nie czytając uważnie wskazówek, a także dodatkowy void, zupełnie nie potrzebny. Co więcej, jak się przyjrzałem przykładowi z kursu to wskaźnik *lista jest tak jak by początkiem listy i wystarczyło dopisać wskaźnik na jego koniec coś jak *koniec. Oraz w funkcji void dodaj koniec dopisałem wskaźnik na referencję koniec. struct Lista { Lista * ogon; int liczba; };
void wypisz( Lista * lista ) { if( lista ) { cout << lista->liczba << ", "; wypisz( lista->ogon ); } }
Lista * ostatni( Lista * lista ) { if( lista ) while( lista->ogon ) lista = lista->ogon; return lista; } void dodajKoniec( Lista *& lista, Lista *& koniec, int liczba ) { Lista * nowy = new Lista; nowy->liczba = liczba; nowy->ogon = NULL; if( lista ) ostatni( koniec )->ogon = nowy; else lista = nowy; koniec = nowy; }
void zniszcz( Lista *& lista ) { while( lista ) { Lista * tmp = lista; lista = lista->ogon; delete tmp; } lista = NULL; } int main() { int liczba; Lista * lista = NULL; Lista * koniec = NULL; cout << "Podaj liczby, o lub blad konczy: \n"; while( cin >> liczba && liczba ) dodajKoniec( lista, koniec, liczba ); cout << "Koniec, o to liczby: \n" << endl; wypisz( lista ); zniszcz( lista ); return 0; }
Mam ogromną nadzieję, że właśnie o to chodziło w tym zadaniu. Fakt, uświadomiłem sobie też, że po długich bataliach ze strukturami danych( a potrzebowałem na to aż 2 dni) można to zadanie zrobić z dodatkowa strukturą, która będzie przechowywać wskaźniki *początek i *koniec. |
|
1 2 « 3 » |