rottingham Temat założony przez niniejszego użytkownika |
R. 45 - zadanie domowe - pytanie do ppkt b » 2019-06-20 18:35:33 Cześć Wszystkim! W treści zadania jest napisane: Znajdź sposób na to, by dodawanie elementów na oba końce listy nie wymagało odwiedzania wszystkich węzłów. |
To znaczy, że mam napisać kod, który dodaje liczby albo na początek albo na koniec bez przechodzenia przez wszystkie węzły? Czy też program ma od razu dodawać liczby na początek i na koniec listy? |
|
pekfos |
» 2019-06-20 18:40:14 Operacje dodawania na początek i koniec listy mają być wykonywane w czasie stałym (niezależnym od ilości elementów w liście). Nie musisz w kodzie użyć obu, ale obie mają mieć właściwą złożoność. Inaczej możesz powiedzieć, że twoja lista jest odwrócona, więc dodawanie na początek jest tak na prawdę dodawaniem na koniec, a dodawanie na "początek" jest wtedy wolne, a nie odwrotnie. |
|
rottingham Temat założony przez niniejszego użytkownika |
» 2019-06-23 14:42:46 Kompletnie nie rozumiem tego co do mnie napisałeś. Sednem mojego pytania było: Czy przy takich danych wejściowych: 1 2 3 ? Powinienem otrzymać takie dane wyjściowe: 3 2 1 1 2 3 ? |
|
pekfos |
» 2019-06-23 15:07:58 Zadanie nic nie mówi o tym, co ma robić program. Masz zoptymalizować funkcję dodajKoniec(). Wciąż ma realizować taką samą funkcjonalność, więc nawet jakbyś chciał, nie rozróżnisz wersji przed i po patrząc tylko na dane wyjściowe. |
|
rottingham Temat założony przez niniejszego użytkownika |
» 2019-06-23 17:31:23 Czyli taki kod (pomimo, że dodaje tylko na koniec) jest prawidłowym rozwiązaniem zadania domowego? #include <iostream>
struct Lista { Lista * ogon; int liczba; };
struct Adres { Lista * ostatni; } * wsk = new Adres;
void wypisz( Lista * lista ) { if( lista ) { std::cout << lista->liczba << ", "; wypisz( lista->ogon ); } }
Lista * ostatni( Lista * lista ) { lista = wsk->ostatni; return lista; }
void dodajKoniec( Lista *& lista, int liczba ) { Lista * nowy = new Lista; nowy->liczba = liczba; nowy->ogon = nullptr; if( lista ) { wsk->ostatni = ostatni( lista )->ogon = nowy; } else wsk->ostatni = 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 ); }
|
|
pekfos |
» 2019-06-23 17:51:54 Nie jest poprawne, bo nie ma sensu. Wcześniej można było mieć dwie niezależne listy, teraz się nie da. |
|
rottingham Temat założony przez niniejszego użytkownika |
» 2019-06-23 18:10:41 Wcześniej można było mieć dwie niezależne listy |
W jaki sposób? |
|
pekfos |
» 2019-06-23 18:19:01 int main() { Lista * lista1 = nullptr, * lista2 = nullptr; dodajKoniec( lista1, 1 ); dodajKoniec( lista2, 2 ); dodajKoniec( lista1, 3 ); dodajKoniec( lista2, 4 ); wypisz( lista1 ); std::cout << '\n'; wypisz( lista2 ); zniszcz( lista1 ); zniszcz( lista2 ); } |
|
« 1 » 2 3 4 5 6 |