Hirdetés
- Motorola Edge 50 Neo - az egyensúly gyengesége
- „Új mérce az Android világában” – Kezünkben a Vivo X300 és X300 Pro
- Vivo X200 Pro - a kétszázát!
- Milyen okostelefont vegyek?
- Kezünkben a OnePlus 15 és az Oppo Find X9-ek
- Apple Watch
- Megvan, melyik Redmi turbóz 9000 mAh-ra
- iPhone topik
- Motorola Edge 70 - többért kevesebbet
- Mobil flották
Ú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]
Új hozzászólás Aktív témák
- 2 db (130 / 131) - Lenovo Legion Pro 7 (16IRX9H) - Intel Core i9-14900HX, RTX 4080
- HIBÁTLAN iPhone 13 Pro 128GB Sierra Blue -1 ÉV GARANCIA - Kártyafüggetlen, MS3388, 100% Akksi
- Sima Vs.Windows Logitech Mx keys s plus és hagyományos Mx keys magyar bemutatása. Új videó linkel
- LG OLED & OLED evo Televíziók: BLACK NOVEMBER -30%
- Samsung Galaxy S21+ / 8/128GB / Kártyafüggetlen / 12Hó Garancia
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest



