[DELPHI] Obousměrný lineární seznam

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod vanik55 18. 3. 2008 09:36

Ahoj, udělal jsem si třídy pro jednosměrný seznam:

seznam:
Kód: Vybrat vše
TSeznam = class
    protected
    hlava:TPrvek;
    predchozi:TPrvek;
    aktualni:TPrvek;
    public
    constructor init;
    destructor done;
    procedure Vytvor;
    procedure Zrus;
    function JePrazdny:boolean;
    procedure ZpristupniPrvni(var prvni: TPrvek);
    procedure VlozPrvni(prvni: TDataPrvku);
    procedure OdeberPrvni;
    procedure ZpristupniNasladnika(var naslednik: TPrvek);
    procedure VlozNaslednika(naslednik: TDataPrvku);
    procedure OdeberNaslednika;
    procedure Obhlidka(var strList: TStringList); overload;
    procedure Obhlidka(var strList: TextFile);  overload;
    function getPrvni:TPrvek;
    function getAktulni:TPrvek;
  end;


třída prvku:
Kód: Vybrat vše
   TPrvek = class
    data:TDataPrvku;
    dalsi:TPrvek;
    constructor init(d: TDataPrvku);
    destructor done;
  end;


A teď přemýšlím jak nejefektivněj z těhto tříd vytvořit obosměrný seznam. Tzn. že chci mit možnost procházet seznam i v opačném pořadí a vklad a odebírat předchůdce aktuálního prvku.
vanik55
Junior
Uživatelský avatar

Odeslat příspěvekod firefoxik 18. 3. 2008 10:12

Přesně tohle sme řešili na střední škole :-)
Nic složitýho, jen to chce mít trochu představivosti a konstrukčního myšlení. A domácí úkoly tady asi nikdo za tebe řešit nebude :-)
AMD PhenomII X4/6GB RAM/640GB+1TB+2TB HDD/GF 650Ti 1GB
firefoxik
Junior
Uživatelský avatar

Odeslat příspěvekod vanik55 18. 3. 2008 10:19

Ja taky po nikom ten ukol vyresit nechci, jenom nevim jak presne vyresit to, že když budu použivat ty metody z toho jednosměrnýho seznamu, který pracujou s tim prvkem kterej obsahuje jenom odkaz na nasledujiciho, jak docílim toho aby se mi tam taky vobjevil odkaz na predchoziho...
vanik55
Junior
Uživatelský avatar

Odeslat příspěvekod beertje 18. 3. 2008 11:32

Buď si do každého prvku přídáš odkaz na předchozího nebo to vyřešíš jednoduchým "trikem" (do uvozovek jsem to dal proto, protože sice funguje, ale bohužel pro opravdu velké seznamy je nepoužitelný): zapamatuj si aktuální prvek, aktuální prvek nastav na hlavu a procházej seznamem tak dlouho, až aktualni.dalsi bude ukazovat na stejný prvek jako je ten, který sis zapamatoval (samozřejmě je třeba ošetřit, když neexistuje předchůdce).
beertje
Junior

Odeslat příspěvekod Nargon 18. 3. 2008 11:47

Kód: Vybrat vše
   TPrvek = class
    data:TDataPrvku;
    dalsi:TPrvek;
    predchozi: TPrvek;
    constructor init(d: TDataPrvku, predchozi: TPrvek);
    destructor done;
  end;

Mno tohle by ti melo napovedet jak na to.
Pak uz jen potrebujes sikovne dodelat ty metody na vkladani, mazani a obousmerne prochazeni.
Nargon
Moderátor

Odeslat příspěvekod firefoxik 19. 3. 2008 01:02

tak napovim trochu vic:
vlozeni za aktualni prvek ->
aktualni := pointer na aktualni prvek v seznamu

new(novy);
aktualni.dalsi^.predchozi := novy;
novy.dalsi := aktualni.dalsi;
aktualni.dalsi := novy;
novy.predchozi := aktualni;
aktualni := novy;

pak jenom osetrit vztahy jestli aktualni je posledni atd.
Je to narychlo, takze dotazy zodpovim.

Jinak papir a tuzka a scematicky diagram mi tohle resi mnohem rychleji nez diskuze na foru :D
firefoxik
Junior
Uživatelský avatar

Odeslat příspěvekod Izibia 22. 3. 2008 12:41

firefoxik píše:Jinak papir a tuzka a scematicky diagram mi tohle resi mnohem rychleji nez diskuze na foru :D

Přesně tak. Místo vláčku pospojovaného šipečkama si namaluj vláček pospojovaný šipečkama v obou směrech, a pak už se nebudeš potřebovat na nic ptát.
Izibia
Junior


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků