Hirdetés

Keresés

Új hozzászólás Aktív témák

  • VladimirR

    nagyúr

    válasz #16741888 #978 üzenetére

    csinalsz egy rekordot az auto adataival, es ket mutatoval
    -egyik mutato mutasson a lista legelso elemere, masik a lista kovetkezo elemre (az utolsonal a kovetkezore mutato legyen nil)
    -egyik mutato mutasson az elozo, masik a kovetkezo elemre (elso elemnel az elozore, utolso elemnel a kovetkezore mutato mutato erteke legyen nil (ezt reszletezem)

    pelda1:

    p_listaelem=^listaelem; (* ez lesz az alabbi rekor tipusu mutato *)
    listaelem=record
      marka:string
      tipus:string;
      szin:string;
      rendszam:string;
      gyartaseve:string;
      prev:p_listaelem; (* ez mutat az elozo elemre *)
      next:p_listaelem; (* ez mutat a kovetkezo elemre *)
    end;


    pelda2:

    p_listaelem=^listaelem; (* ez lesz az alabbi rekor tipusu mutato *)
    listaelem=record
      marka:string
      tipus:string;
      szin:string;
      rendszam:string;
      gyartaseve:string;
      first:p_listaelem; (* ez mutat az elso elemre *)
      next:p_listaelem; (* ez mutat a kovetkezo elemre *)
    end;


    lista letrehozasa:
    kell egy elem, es egy temp elem, amibe az adatfeltoltes tortenik, s amit majd a listahoz fuzol

    var elem=p_listaelem;
        temp=p_listaelem;


    letrehozzuk, es feltoltjuk a listat (a beolvasas nincs benne):

    for i:=1 to 30 do begin
      (* marka, tipus, szin, rendszam es gyartaseve valtozok beolvasasa *)
      new(temp); (* memoriafoglalas egy listaelem szamara *)
      temp^.marka:=marka;
      temp^.tipus:=tipus;
      temp^.szin:=szin;
      temp^.rendszam:=rendszam;
      temp^.gyartaseve:=gyartaseve;
      if i=1 then (* ha az elso elemet hozzuk letre, vagyis a listank meg ures, nincs aktualis eleme *)
        temp^.prev:=nil; (* akkor az elozore mutato mutato legyen nil *)
      else begin (* egyebkent *)
        temp^.prev:=elem; (* az elozo legyen az aktualis elem *)
        elem^.next:=temp; (* az aktualis elem kovetkezoje pedig legyen a jelenlegi *)
      end;
      temp^.next:=nil; (* mivel jelenleg nincs kovetkezo elem, ezert az legyen nil *)
      elem:=temp; (* legyen az ujonnan letrehozott elem az aktualis *)
    end;


    ugras a lista elejere (addig megyunk, amig nem lesz elozo elem):

    while elem^.prev <> nil do
      elem:=elem^.prev;


    ugras a lista vegere (addig megyunk, amig nem lesz kovetkezo elem):

    while elem^.next <> nil do
      elem:=elem^.next;


    listaelem beszurasa az aktualis elem moge:

    new(temp); (* memoria foglalasa az uj listaelemnek *)
    temp^.prev:=elem; (* az uj elem elott levo a jelenlegi elem lesz *)
    temp^.next:=elem^.next; (* az uj elem utan a jelenlegi elemet koveto elem lesz *)
    temp^.prev^.next:=temp; (* az uj elem elott levo elemnek megmondjuk, hogy az uj elem lesz mogotte (tudom, hulyen hangszik) *)
    temp^.next^.prev:=temp; (* az uj elem utan jovo elemnek megmondjuk, hogy az uj elem lesz elotte (tudom, ez is) *)


    a program vegen illik (kvazi kotelezo) torolni a listankat, felszabaditva ezzel a memoriat:
    ehhez eloszor a lista elejere (vagy vegere) kell allnunk (fentebbi kod), es sorbamenni az elemeken, majd mindet torolni
    ha elol allunk a kovetkezokeppen torlunk (ha a vegen, akkor a next, es a prev ertelemszeruen felcserelendo)

    while elem^.next <> nil do begin
      temp:=elem; (* fogjuk az aktualis elemet *)
      elem:=elem^.next; (* majd az azt kovetot tesszuk aktualissa *)
      dispose(temp); (* vegul felszabaditjuk az elem altal foglalt memoriat *)
    end;


    mivel ezzel nem toroljuk az utolso elemet (aminel ugye a next nil volt), ezert azt kulon kell torolnunk

    dispose(elem);

    erdemes egyebkent a tesztelesi szakaszban a program elejen es vegen is megszamolni a szabad memoriat
    program elejen:

    size:=memavail;

    program vegen:

    writeln;
    writeln(size);
    size:=memavail;
    writeln(size);


    ha a ket ertek nem egyezik, akkor valami gubanc van a kodban: vagy tobb elemet hoztunk letre, mint amennyivel szamoltunk es vagy emiatt, vagy az esetlegesen a torlesnel levo hibabol adodoan kevesebbet toroltunk, mint amennyi van
    ekkor erdemes lepesenkent ellenorizni a memoriameretet
    megnezzuk, hogy mekkora egy

    sizeof(elem);

    majd a letrehozas utan is lekerdezzuk a szabad memoriat, es ebbol kivojnuk az elemek szamanak, es azok meretenek szorzatat, es ekkor meg kell kapnunk a kezdetbeni szabad memoria meretet

    remelem tudtam seginteni, amr eleg reg pascaloztam, de akkor ugyahogy mentek ezek a dinamikus listak

    ha valami kellene meg, vagy ebbol nem tiszta valami (pedig erot vettem magamon, es kommenteztem is), akkor kerdezz nyugodtan

    peldaprogi itt => Bovebben: [link]

  • dat

    senior tag

    válasz #16741888 #978 üzenetére

    PumPi....Elte info tanár szak? vagy mire jársz? :)

    Küldök mailben egy láncolt listát kezelő Unitot...

    [Szerkesztve]

Új hozzászólás Aktív témák