Untitled

 avatar
user_1100393
python
2 years ago
3.7 kB
3
Indexable
Never
from typing import Any


class ListaWpis:
    def __init__(self, wart: Any, nast: 'ListaWpis' = None, poprz: 'ListaWpis' = None):
        self.wart = wart
        self.poprz = poprz
        self.nast = nast

    def dodaj_po_nim(self, wart: Any):
        temp = ListaWpis(wart)
        if self.nast == self:
            temp.poprz = self
            temp.nast = None
            self.nast = temp
            return None
        if self.nast is None:
            temp.poprz = self
            temp.nast = None
            self.nast = temp

            return None

        temp.poprz = self
        temp.nast = self.nast
        self.nast.poprz = temp
        self.nast = temp

    def dodaj_przed_nim(self, wart: Any):
        if self.nast == self: # wartownik/pusta lista
            self.dodaj_po_nim(wart) # nie da sie dodac przed wartownikiem
            return None
        temp = ListaWpis(wart)
        temp.poprz = self.poprz
        temp.nast = self
        self.poprz.nast = temp
        self.poprz = temp


class Lista_2k_1w:
    def __init__(self):
        self.wartow = ListaWpis('wartow')
        self.wartow.nast = self.wartow
        self.wartow.poprz = self.wartow

    def ostatni_el(self) -> ListaWpis:
        if self.wartow.nast == self.wartow:
            return self.wartow
        else:
            koniec = self.wartow
            while koniec.nast is not None:
                koniec = koniec.nast
            return koniec

    def pierwszy_el(self) -> ListaWpis:
        return self.wartow.nast

    def pobierz_el(self, idx: int) -> ListaWpis:
        if idx == 0:
            return self.pierwszy_el().wart
        if idx>0:
            temp = self.pierwszy_el()
            while idx>1:
                idx-=1
                temp = temp.nast
            return temp.wart
        if idx<0:
            temp = self.ostatni_el()
            while idx<-1:
                idx+=1
                temp = temp.poprz
            return temp.wart

    def co_drugi(self) -> 'Lista_2k_1w':
        temp = Lista_2k_1w()
        if self.wartow.nast == self.wartow:
            return temp
        codrugi = 0
        szukane = self.pierwszy_el()
        while szukane:
            if codrugi % 2 == 1:
                codrugi += 1
                szukane = szukane.nast
                continue
            temp.ostatni_el().dodaj_po_nim(szukane.wart)
            codrugi +=1
            szukane = szukane.nast
        return temp

    def wyszukaj(self, wart: Any) -> ListaWpis:
        if self.wartow.nast == self.wartow:
            return None
        temp = self.pierwszy_el()
        while temp:
            if temp.wart == wart:
                return temp
            temp = temp.nast
        return None

    def print_w_tyl(self):
        temp = self.ostatni_el()
        if self.wartow.nast == self.wartow:
            print('Lista jest pusta')
        drukowanie = ''
        while temp != self.wartow:
            drukowanie += temp.wart
            if temp != self.wartow.nast:
                drukowanie += '‘;‘'
            temp = temp.poprz
        print(drukowanie)


lista = Lista_2k_1w()
lista.ostatni_el().dodaj_po_nim('3')
lista.ostatni_el().dodaj_po_nim('4')
lista.ostatni_el().dodaj_przed_nim('0')
lista.ostatni_el().dodaj_po_nim('34')
lista.ostatni_el().dodaj_po_nim('5')
lista.ostatni_el().dodaj_po_nim('6')
lista.ostatni_el().dodaj_po_nim('7')
lista.ostatni_el().dodaj_po_nim('11')
lista.ostatni_el().dodaj_po_nim('8')
lista.print_w_tyl()
lista.wyszukaj('3')
# print(lista.pobierz_el(-4))
# lista2 = lista.co_drugi()
# lista2.print_w_tyl()