Powtórka — kreator listy wiązanej
Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 24 z 107.
Wyzwanie
ŁatwyZbudujmy od podstaw listę jednokierunkową! Utworzysz strukturę danych, w której każdy węzeł wskazuje na następny, tworząc w pamięci łańcuch połączonych wartości.
Podzielisz swój kod na dwa pliki:
linkedlist.go: Zdefiniuj strukturęNodez polamiValue(int) iNext(*Node). Utwórz strukturęLinkedList, która przechowuje wskaźnik do węzłaHead. Zaimplementuj następujące metody dla*LinkedList:Append— dodaje nowy węzeł z podaną wartością na końcu listyPrepend— dodaje nowy węzeł z podaną wartością na początku listyPrint— przechodzi przez listę i wyświetla wszystkie wartości oddzielone przez->, kończąc nanil
main.go: Odczytaj wartości z wejścia, zbuduj listę jednokierunkową, dodając węzły na końcu i na początku, a następnie wyświetl końcową strukturę listy.
Dane wejściowe będą podane w następujący sposób:
- Wiersz 1: Pierwsza wartość do dodania na końcu
- Wiersz 2: Druga wartość do dodania na końcu
- Wiersz 3: Wartość do dodania na początku
Twoja metoda Print powinna wyświetlić listę w następującym formacie:
[value1] -> [value2] -> [value3] -> nilNa przykład dla wartości 10, 20 i 5 wynik powinien wyglądać tak:
5 -> 10 -> 20 -> nilMetoda Append musi przejść do końca listy (gdzie Next ma wartość nil) przed dodaniem nowego węzła. Metoda Prepend powinna utworzyć nowy węzeł, ustawić jego Next na bieżącą głowę listy, a następnie zaktualizować głowę, tak aby wskazywała na nowy węzeł. Pamiętaj, że pusta lista ma głowę o wartości nil, dlatego uwzględnij ten przypadek w metodzie Append.
Spróbuj swoich sił
package main
import "fmt"
func main() {
// Wczytaj wartości wejściowe
var val1, val2, val3 int
fmt.Scanln(&val1)
fmt.Scanln(&val2)
fmt.Scanln(&val3)
// Utwórz nową listę jednokierunkową
list := &LinkedList{}
// TODO: Użyj Append, aby dodać val1 i val2 do listy
// TODO: Użyj Prepend, aby dodać val3 na początek listy
// TODO: Wyświetl końcową strukturę listy
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP w Go
Pliki zewnętrzneObszar roboczy i moduły GoPakiety i importyNazwy eksportowane i nieeksportowaneWprowadzenie do OOP w GoStruktury jako klasyDefiniowanie metod dla strukturOdbiorniki wskaźnikowe i wartościoweInicjalizacja strukturFunkcje konstruktoraPodsumowanie – prosty kalkulator4Interfejsy
Wprowadzenie do interfejsówImplementacja niejawnaInterfejs jako kontraktPusty interfejs (any)Asercja typuPrzełącznik typówKompozycja interfejsówInterfejsy Stringer i ErrorPowtórka — kalkulator figur7Hermetyzacja
Pola eksportowane i nieeksportowaneHermetyzacja na poziomie pakietuMetody pobierające i ustawiająceUkrywanie informacji w GoPowtórka – dane studentów10Typy generyczne (Go 1.18+)
Wprowadzenie do typów generycznychParametry typówOgraniczenia typówStruktury generyczneObejście ograniczeń metod generycznychPodsumowanie — generyczna kolekcja2Typy i struktury w praktyce
Typy proste i złożoneDefiniowanie własnych typówTagi pól strukturStruktury anonimoweStruktury zagnieżdżoneWartości zerowe i domyślnePodsumowanie – książka kontaktów5Kompozycja zamiast dziedziczenia
Dlaczego Go nie ma dziedziczeniaPodstawy osadzania strukturPromowanie metodOsadzanie wielu strukturOsadzanie a agregacjaPrzesłanianie osadzonych metodPodsumowanie — hierarchia pracowników8Obsługa błędów i programowanie obiektowe
Interfejs błęduWłasne typy błędówOpakowywanie błędów (fmt.Errorf)Błędy wartowniczeerrors.Is() i errors.As()Panic, Defer i RecoverPodsumowanie — parser plików3Wskaźniki i pamięć
Podstawy wskaźników w GoWskaźniki do strukturPrzekazywanie przez wartość a przez referencjęFunkcja new()Odśmiecanie pamięci w GoPowtórka — kreator listy wiązanej6Polimorfizm w Go
Polimorfizm za pomocą interfejsówDuck typing w GoZasady spełniania interfejsówKolekcje polimorficzneWstrzykiwanie zależnościPowtórka — procesor płatności9Współbieżność i OOP
Podstawy goroutinesKanały i komunikacjaKanały buforowane i niebuforowaneInstrukcja selectsync.Mutex i sync.RWMutexsync.WaitGroupProjektowanie struktur bezpiecznych wątkowoPowtórka – pula workerów12Zaawansowane zagadnienia programowania obiektowego
Wzorzec opcji funkcyjnychWzorzec Builder w GoŁańcuchowe wywoływanie metodAliasy typów a definicje typówPodstawy refleksjiPrzegląd generowania koduPoćwicz samodzielnie: Kompilator Go online