Sprawdź się
Zapisz metody zwroc_glowa() i zwroc_ogon, które zwrócą wartości zapisane odpowiednio w pierwszym i ostatnim elemencie listy niecyklicznej jednokierunkowej bez ich usuwania. Jeżeli lista jest pusta, metody powinny zwrócić minimalną wartość całkowitą.
Działanie programu przetestuj dla listy, do której dodasz kolejno wartości 3, 5, 8.
Poprawny wynik działania programu:
Głowa: 3
Ogon: 8Wykorzystaj referencję glowa oraz pętlę przechodzącą listę do końca.
import sys
class Wezel:
def __init__(self, liczba):
self.liczba = liczba
self.nastepny = None
class Lista:
def __init__(self):
self.glowa = None
def dodaj(self, liczba):
nowy = Wezel(liczba)
if self.glowa == None:
self.glowa = nowy
return
pomocniczy = self.glowa
while pomocniczy.nastepny != None:
pomocniczy = pomocniczy.nastepny
pomocniczy.nastepny = nowy
def zwroc_glowa(self):
if self.glowa != None:
return self.glowa.liczba
return -sys.maxsize - 1
def zwroc_ogon(self):
if self.glowa == None:
return -sys.maxsize - 1
pomocniczy = self.glowa
while pomocniczy.nastepny != None:
pomocniczy = pomocniczy.nastepny
return pomocniczy.liczba
lista = Lista()
lista.dodaj(3)
lista.dodaj(5)
lista.dodaj(8)
print("Głowa:", lista.zwroc_glowa())
print("Ogon:", lista.zwroc_ogon())Zapisz metodę podaj_rozmiar(), która zwróci liczbę elementów zapisanych w liście niecyklicznej jednokierunkowej.
Działanie programu przetestuj dla listy, do której dodasz kolejno wartości 1, 2, 3.
Poprawny wynik działania programu:
Rozmiar: 3Wykorzystaj pomocniczą referencję oraz pętlę przechodzącą listę do końca.
class Wezel:
def __init__(self, liczba):
self.liczba = liczba
self.nastepny = None
class Lista:
def __init__(self):
self.glowa = None
def dodaj(self, liczba):
nowy = Wezel(liczba)
if self.glowa == None:
self.glowa = nowy
return
pomocniczy = self.glowa
while pomocniczy.nastepny != None:
pomocniczy = pomocniczy.nastepny
pomocniczy.nastepny = nowy
def podaj_rozmiar(self):
rozmiar = 0
if self.glowa == None:
return 0
pomocniczy = self.glowa
while pomocniczy != None:
pomocniczy = pomocniczy.nastepny
rozmiar += 1
return rozmiar
lista = Lista()
lista.dodaj(1)
lista.dodaj(2)
lista.dodaj(3)
print("Rozmiar:", lista.podaj_rozmiar())Zapisz metodę usun_ostatni(), która usuwać będzie ostatni element listy niecyklicznej jednokierunkowej i zwróci zapisaną w nim wartość lub minimalną wartość całkowitą, jeżeli lista będzie pusta.
Działanie programu przetestuj dla listy, do której dodasz kolejno wartości 1, 2, 3, a następnie usuniesz dwa ostatnio dodane elementy.
Poprawny wynik działania programu:
Lista: 1Wykorzystaj dwie referencje pomocnicze oraz pętlę przechodzącą listę do końca.
import sys
class Wezel:
def __init__(self, liczba):
self.liczba = liczba
self.nastepny = None
class Lista:
def __init__(self):
self.glowa = None
def dodaj(self, liczba):
nowy = Wezel(liczba)
if self.glowa == None:
self.glowa = nowy
return
pomocniczy = self.glowa
while pomocniczy.nastepny != None:
pomocniczy = pomocniczy.nastepny
pomocniczy.nastepny = nowy
def wypisz(self):
if self.glowa == None:
print("Lista jest pusta")
return
print("Lista: ", end="")
pomocniczy = self.glowa
while pomocniczy:
print(pomocniczy.liczba, "", end="")
pomocniczy = pomocniczy.nastepny
print()
def usun_ostatni(self):
liczba = -sys.maxsize - 1
if self.glowa == None:
return liczba
pomocniczy1, pomocniczy2 = self.glowa, None
if pomocniczy1.nastepny == None:
liczba = pomocniczy1.liczba
self.glowa = None
return liczba
while pomocniczy1.nastepny != None:
pomocniczy2 = pomocniczy1
pomocniczy1 = pomocniczy1.nastepny
pomocniczy2.nastepny = None
liczba = pomocniczy1.liczba
return liczba
lista = Lista()
lista.dodaj(1)
lista.dodaj(2)
lista.dodaj(3)
lista.usun_ostatni()
lista.usun_ostatni()
lista.wypisz()Zapisz metodę odwroc(), która odwróci kolejność elementów listy niecyklicznej jednokierunkowej.
Działanie programu przetestuj dla listy, do której dodasz kolejno wartości 3, 5, 8.
Poprawny wynik działania programu:
Lista: 8 5 3Wykorzystaj trzy referencje pomocnicze oraz pętlę przechodzącą listę do końca.
class Wezel:
def __init__(self, liczba):
self.liczba = liczba
self.nastepny = None
class Lista:
def __init__(self):
self.glowa = None
def dodaj(self, liczba):
nowy = Wezel(liczba)
if self.glowa == None:
self.glowa = nowy
return
pomocniczy = self.glowa
while pomocniczy.nastepny != None:
pomocniczy = pomocniczy.nastepny
pomocniczy.nastepny = nowy
def wypisz(self):
print("Lista: ", end="")
pomocniczy = self.glowa
while pomocniczy:
print(pomocniczy.liczba, "", end="")
pomocniczy = pomocniczy.nastepny
print()
def odwroc(self):
aktualny, poprzedni, nastepny = self.glowa, None, None
while aktualny != None:
nastepny = aktualny.nastepny
aktualny.nastepny = poprzedni
poprzedni = aktualny
aktualny = nastepny
self.glowa = poprzedni
lista = Lista()
lista.dodaj(3)
lista.dodaj(5)
lista.dodaj(8)
lista.odwroc()
lista.wypisz()Zapisz metodę wypisz_wstecz(), która wypisuje elementy listy niecyklicznej dwukierunkowej od końca.
Działanie programu przetestuj dla listy, do której dodasz kolejno wartości 13, 8, 5.
Poprawny wynik działania programu:
Lista: 5 8 13Wykorzystaj referencje pomocniczy i ogon.
class Wezel:
def __init__(self, liczba):
self.liczba = liczba
self.nastepny = None
self.poprzedni = None
class Lista:
def __init__(self):
self.glowa = self.ogon = None
def dodaj(self, liczba):
nowy = Wezel(liczba)
if self.glowa == None:
self.glowa = self.ogon = nowy
return
self.ogon.nastepny = nowy
nowy.poprzedni = self.ogon
self.ogon = nowy
def wypisz_wstecz(self):
if self.glowa == None: return
print("Lista: ", end="")
pomocniczy = self.ogon
while pomocniczy.poprzedni != None:
print(pomocniczy.liczba, "", end="")
pomocniczy = pomocniczy.poprzedni
print(pomocniczy.liczba)
lista = Lista()
lista.dodaj(13)
lista.dodaj(8)
lista.dodaj(5)
lista.wypisz_wstecz()Zapisz funkcję wypisz_rekursywnie(), która wypisze elementy listy jednokierunkowej w odwrotnej kolejności, tj. od ogona do głowy. W rozwiązaniu wykorzystaj rekurencję i wywołaj napisaną funkcję.
Działanie programu przetestuj dla listy, do której dodasz kolejno wartości 8, 13, 2.
Poprawny wynik działania programu:
21 13 8Do pierwszego wywołania funkcji wypisz_rekursywnie() jako argument przekaż referencję na pierwszy element listy. Wywołania rekurencyjne wewnątrz funkcji powinny się zakończyć, jeżeli funkcja jako argument otrzyma referencję pustą.
class Wezel:
def __init__(self, liczba):
self.liczba = liczba
self.nastepny = None
class Lista:
def __init__(self):
self.glowa = None
def dodaj(self, liczba):
nowy = Wezel(liczba)
if self.glowa == None:
self.glowa = nowy
return
pomocniczy = self.glowa
while pomocniczy.nastepny != None:
pomocniczy = pomocniczy.nastepny
pomocniczy.nastepny = nowy
def wypisz_rekursywnie(wezel):
if wezel != None:
wypisz_rekursywnie(wezel.nastepny)
print(wezel.liczba, "", end="")
lista = Lista()
lista.dodaj(8)
lista.dodaj(13)
lista.dodaj(21)
wypisz_rekursywnie(lista.glowa)Zapisz metodę wypisz_od_wezla(), która wypisuje elementy listy cyklicznej dwukierunkowej, zaczynając od węzła wskazywanego przez podaną referencję wezel. Jeśli metoda otrzyma jako argument pustą referencję (None), wypisywanie powinno rozpocząć się od pierwszego węzła listy.
Działanie programu przetestuj dla listy, do której dodasz kolejno wartości 13, 21, 34.
Poprawny wynik działania programu:
Lista: 21 34 13Wykorzystaj węzeł pomocniczy i sprawdź, czy pole nastepny nie wskazuje na węzeł, od którego zaczynasz wypisywać listę.
class Wezel:
def __init__(self, liczba):
self.liczba = liczba
self.nastepny = None
self.poprzedni = None
class Lista:
def __init__(self):
self.glowa = None
def dodaj(self, liczba):
nowy = Wezel(liczba)
if self.glowa == None:
self.glowa = nowy
self.glowa.nastepny = self.glowa
self.glowa.poprzedni = self.glowa
return
pomocniczy = self.glowa.poprzedni
nowy.nastepny = self.glowa
nowy.poprzedni = pomocniczy
self.glowa.poprzedni = nowy
pomocniczy.nastepny = nowy
def wypisz_od_wezla(self, wezel):
if self.glowa == None:
return
print("Lista: ", end="")
if wezel == None:
wezel = self.glowa
pomocniczy = wezel
while pomocniczy.nastepny != wezel:
print(pomocniczy.liczba, "", end="")
pomocniczy = pomocniczy.nastepny
print(pomocniczy.liczba)
lista = Lista()
lista.dodaj(13)
lista.dodaj(21)
lista.dodaj(34)
lista.wypisz_od_wezla(lista.glowa.nastepny)Zapisz metodę usun_wezel(), która usuwa przekazany jako referencja węzeł z listy cyklicznej dwukierunkowej i zwraca wartość przechowywaną w tym węźle. W przypadku, gdy argumentem metody jest referencja pusta (None), metoda powinna usuwać pierwszy węzeł listy. Jeśli lista jest pusta, funkcja powinna zwrócić minimalną wartość całkowitą reprezentowaną przez stałą -sys.maxsize - 1.
Działanie programu przetestuj dla listy, do której dodasz kolejno wartości 13, 21, 34. Usuwanym węzłem powinien być węzeł znajdujący się bezpośrednio po głowie (jej następnik).
Poprawny wynik działania programu:
Lista: 13 34Odpowiednio ustaw referencje węzłów, na które ustawione są referencje węzła usuwanego.
import sys
class Wezel:
def __init__(self, liczba):
self.liczba = liczba
self.nastepny = None
self.poprzedni = None
class Lista:
def __init__(self):
self.glowa = None
def dodaj(self, liczba):
nowy = Wezel(liczba)
if self.glowa == None:
self.glowa = nowy
self.glowa.nastepny = self.glowa
self.glowa.poprzedni = self.glowa
return
pomocniczy = self.glowa.poprzedni
nowy.nastepny = self.glowa
nowy.poprzedni = pomocniczy
self.glowa.poprzedni = nowy
pomocniczy.nastepny = nowy
def wypisz(self):
if self.glowa == None:
return
print("Lista: ", end="")
pomocniczy = self.glowa
while pomocniczy.nastepny != self.glowa:
print(pomocniczy.liczba, "", end="")
pomocniczy = pomocniczy.nastepny
print(pomocniczy.liczba)
def usun_wezel(self, wezel):
if self.glowa == None:
return -sys.maxsize - 1
if wezel == None:
wezel = self.glowa
liczba = wezel.liczba
wezel.nastepny.poprzedni = wezel.poprzedni
wezel.poprzedni.nastepny = wezel.nastepny
if wezel == self.glowa:
if glowa.nastepny != self.glowa:
self.glowa = self.glowa.nastepny
else:
self.glowa = None
return liczba
lista = Lista()
lista.dodaj(13)
lista.dodaj(21)
lista.dodaj(34)
lista.usun_wezel(lista.glowa.nastepny)
lista.wypisz()