Linearni seznam – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Linearni seznam – Pascal – Fórum – Programujte.comLinearni seznam – Pascal – Fórum – Programujte.com

 

pidgin0
Návštěvník
28. 1. 2010   #1
-
0
-

Ahoj,
prosím Vás potřeboval bych poradit, pro někoho asi s maličkostí, ale já nevím....?
Mám tuto funkci a nevím jakým způsobem jí volat? ( ta funkce je opsaná, nepsal jsem jí já, jen se to snažím pochopit)



function vypust(P:Uk):Uk;
{ P ukazuje na předchůdce rušeného prvku }
{ Funkce vrací ukazatel na vypuštěný prvek, případně vrací hodnotu nil,
* pokud byl prvek P posledním prvkem seznamu }
var Q:Uk; { TOTO V KNIZE NENÍ!! }
begin
Q := P^.dalsi; { Q odkazuje na rušený prvek }
if Q <> nil then
begin
P^.dalsi := Q^.dalsi; { uzel Q je vypuštěn ze seznamu }
Q^.dalsi := nil; { odpojit před dalším použitím }
end;
vypust := Q;
end;


Možná nebude od věci celý kód. Připomínám ještě jednou že to je opsané z knihy, jde mi o pochopení té věci. Myslím tím
napíšu vypust("argument typu 'Uk'") // ale jaký????
Takže celý kód:



program seznamJednosmerny;

type Uk = ^Uzel;
Uzel = record
info : integer;
dalsi : Uk;
pred:Uk;
end;

var seznam : Uk;
seznamDva: Uk;

procedure vytvor(N:integer; var P: Uk);
var Q: Uk;
begin
P:= nil;
while N > 0 do
begin
new(Q);
Q^.info := N;
Q^.dalsi := P;
P:= Q;
N:= N-1;
end;
writeln('vše je ok');
end;

procedure vytvor2(N: integer; var P:Uk);
{ P bude ukazovat na začátek vytvořeného seznamu }
var Q,R:Uk;
I:integer;
{ P - začátek seznamu (první prvek)
* Q - konec seznamu (poslední prvek)
* R - nový prvek }
begin
new(P); { první prvek seznamu vytvoříme odděleně }
P^.info := 1;
P^.dalsi := nil;
Q := P; {první prvek seznamu je zároveň posledním }
for I:=2 to N do
begin
new(R);
R^.info:=I;
Q^.dalsi:= R;
Q:=R;
end;
Q^.dalsi := nil { ještě seznam řádně zakončíme }
end;

procedure vlozZa(P,Q:Uk);
{ P ukazuje na prvek seznamu, za který se má vlkádat
* Q ukazuje na nově vkládaný prvek }
begin
Q^.dalsi:=P^.dalsi;
P^.dalsi:=Q;
end;

procedure vlozPred(P,Q:Uk);
{ P ukazuje na prvek seznamu, před který se má vkládat
* Q ukazuje na nově vkládaný prvek }
var K: integer;
begin
K:=Q^.info; { do proměnné K si odložíme obsah Q }
Q^ := P^; { kopírují se celé uzly, tj Info i Dalsi }
P^.info := K; { dokončit výměnu hodnot Info }
P^.dalsi := Q; { zapojit nový prvek }
end;

function vypust(P:Uk):Uk;
{ P ukazuje na předchůdce rušeného prvku }
{ Funkce vrací ukazatel na vypuštěný prvek, případně vrací hodnotu nil,
* pokud byl prvek P posledním prvkem seznamu }
var Q:Uk; { TOTO V KNIZE NENÍ!! }
begin
Q := P^.dalsi; { Q odkazuje na rušený prvek }
if Q <> nil then
begin
P^.dalsi := Q^.dalsi; { uzel Q je vypuštěn ze seznamu }
Q^.dalsi := nil; { odpojit před dalším použitím }
end;
vypust := Q;
end;

procedure vypis(var P:uk);
begin
while P <> nil do
begin
write(P^.info);
write(' ---> ');
write(double(P^.dalsi));
P:=P^.dalsi;
writeln();
end;
end;



var cislo : integer;

begin
writeln('napiš číslo');
read(cislo);
vytvor(cislo, seznam);
vypis(seznam);

read(cislo);
vytvor2(cislo, seznamDva);
writeln('enter a vipíše se seznam');
vypis(seznamDva);
read(cislo);

end.

Aby bylo jasné jak volám ty předchozí.
Moc děkuji za každou radu:-)

P.S.- snad budu někdy taky radit:-)

Nahlásit jako SPAM
IP: 83.208.170.–
illioner0
Stálý člen
28. 1. 2010   #2
-
0
-

Kdybych bral ze zadas vytvorit seznam nejmin o 6 prvcich,
tak kdyz chces vypustit treba 4. prvek

var
prvek:Uk; {pomocna promenna ukazujici na prvek seznamu}
i:integer;
begin

{tady ten tvuj kod}

prvek:=seznam; {z tohoto vypustime}
for i:=1 to 4-2 do {odecteme 2 protoze na zacatku odkazujeme uz na prvni prvek (-1) a skoncime o jeden driv (-1) -> funkce odstranuje naslednika}
prvek:=prvek.dalsi;

vypust(prvek);
vypis(seznam); {a nebude tam}
end.

Nahlásit jako SPAM
IP: 85.71.152.–
Nechápu softwarové firmy, ktere utrácejí za čim dál těžkopádnější DRM ochranu!! Vidět kolem snahu o free2play model je jako příjemné připomenutí časů shareware (jen ten Microsoft stále nic nepochopil)
Krychlik
~ Anonymní uživatel
195 příspěvků
28. 1. 2010   #3
-
0
-

To illioner : Urcite to neni dobre, protoze vypust je funkce. Spis prvek1:=vypust(prvek); Presne jak je v popisku te fuknce.
To pidgin : Neni pravda, ze to v te knize neni, nalistuj si par stranek dozadu, jak zacinaji spojaky a tam je deklarovane "Uk". Aby se hlavicka nemusela psat u kazde funkce. Teda pokud je to ta kniha, ktera myslim ze to je. Tenka, hneda, Topfer.

Nahlásit jako SPAM
IP: 195.113.20.–
illioner0
Stálý člen
28. 1. 2010   #4
-
0
-

To Krychlik : tvůj příklad je taky možnost (záleží na konkrétnim využití), jinak ale tim mym nic nepokazí, nemusim přece hodnotu která doputuje z funkce nikde chytat, aby ta funkce proběhla v pořádku a seznam se zkrátil!

Nahlásit jako SPAM
IP: 85.71.152.–
Nechápu softwarové firmy, ktere utrácejí za čim dál těžkopádnější DRM ochranu!! Vidět kolem snahu o free2play model je jako příjemné připomenutí časů shareware (jen ten Microsoft stále nic nepochopil)
Krychlik
~ Anonymní uživatel
195 příspěvků
28. 1. 2010   #5
-
0
-

To illioner : No dobre, mas pravdu ze se to nemusi chytat, bude to fungovat, ale vymazat a zapomenout adresu je prasarna, potom nemuzes uvolnit pamet. Jednou to proste spadne.

Nahlásit jako SPAM
IP: 195.113.20.–
pidgin0
Návštěvník
28. 1. 2010   #6
-
0
-

díky moc, podívám se, ano je to topfer:-) ale zatím si s tím nějak nevím rady. a zajímavé je že když projdu seznam jednou a pak ho chci projít podruhé tak je seznam prázdný(??):-O

Nahlásit jako SPAM
IP: 83.208.170.–
Krychlik
~ Anonymní uživatel
195 příspěvků
28. 1. 2010   #7
-
0
-

To pidgin : A pri tom druhem prochazeni- nastavis si "prochazeci" ukazatel na zacetek? Po prvnim projiti ho budes mit na konci, a pak prochazis od konce do konce, coz asi nechces.

Nahlásit jako SPAM
IP: 195.113.20.–
illioner0
Stálý člen
28. 1. 2010   #8
-
0
-

To Krychlik : jo obalit to do dispose :-)
To pidgin :
Je prazdny protoze tam vadi to var v deklaraci (vnitrek procedury pak zachazi s odkazem ukazatele a meni ho)
procedure vypis(var P:uk);
udelej
procedure vypis(P:uk);
a promenna seznam zustane sama sebou, nebo pouzivej pro vypis tu pomocnou promennou prvek

Nahlásit jako SPAM
IP: 85.71.152.–
Nechápu softwarové firmy, ktere utrácejí za čim dál těžkopádnější DRM ochranu!! Vidět kolem snahu o free2play model je jako příjemné připomenutí časů shareware (jen ten Microsoft stále nic nepochopil)
pidgin0
Návštěvník
28. 1. 2010   #9
-
0
-

DÍKY MOC. teď už je mi to všechno jasnější ale ještě jednu věc nějak nevím. napsal jsem si zkusmo průchod takto



//průchod seznamem
procedure pruchod(P:Uk);
begin
writeln('--- pruchod seznamem ');
while P <> nil do
begin
if P^.info = 1 then
begin
vypust(P);
end;
P:=P^.dalsi;
writeln();
end;
end;

ale vypustí mi to až následující prvek, ale myslím že v té knize od topfera se o tom nějak zmiňuje takže se na to jdu podívat, díky moc, problém byl v tom var hlavně

Nahlásit jako SPAM
IP: 83.208.170.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

Podobná vlákna

Lineární seznam — založil haha

Lineární seznam - sort — založil Oromis

Python - lineární seznam — založil Tomáš

Pomoc linearni seznam — založil Honza

Linearní spojový seznam — založil Rivers

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý