Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Rušení prvků v dynamickém seznamu

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Rušení prvků v dynamickém seznamu

Autor: Maaartin

18:03:03 14.01.2011

O moc lepsi to asi nebude nikdy. Problem je v tom ze zacatek potrebu zvlastni zachazeni. Nekdy pomuze nalepit na zacatek dummy prvek, pak provest to co mas v druhym cyklu a ten dummy nakonec zahodit. Ale nic moc.

Citovat příspěvek

 

Re: Rušení prvků v dynamickém seznamu

Autor: dr3ex

8:16:39 14.01.2011

Děkuji, nakonec jsem to zprovoznil.

[code]
procedure OdstranPrazdne(var u: ukazatel);
var pom1, pom2: ukazatel;
begin
pom1 := u;
if pom1 <> nil do begin
while pom1^.prazdny do begin
pom2 := pom1;
u := pom1^.dalsi;
pom1 := u;
dispose(pom2);
end;
while pom1^.dalsi <> nil do begin
if pom1^.dalsi^.prazdny then begin
pom2 := pom1^.dalsi;
pom1^.dalsi := pom1^.dalsi^.dalsi;
dispose(pom2);
end else pom1 := pom1^.dalsi;
end;
end;
end;
[/code]

Připadá mi, že je to zbytečně složité (2x while cyklus) na to jaká jednoduchá věc se řeší. Nejde to řešit jednodušeji?

Citovat příspěvek

 

Re: Rušení prvků v dynamickém seznamu

Autor: Mi.Chal

20:56:01 13.01.2011

dr3ex Napsal:
-------------------------------------------------------
> while pom1^.dalsi <> nil do begin
> if pom1^.dalsi^.prazdny then begin
> pom2 := pom1^.dalsi;
> pom1 := pom2^.dalsi;
> dispose(pom2);
> end;
> pom1 := pom1^.dalsi;
> end;
> end;
> end;
>
> Nedokážu pochopit proč tak, jak jsem to
> naprogramoval, to nefunguje. Dokáže někdo pomoci?

protoze si zrusis referenci na zpracovavany prvek (to je to prirazeni pom1:= ... v if). Kdyz chces zrusit prvek pom.dalsi, tak bys tam mel mit neco jako

pokracovani := pom.dalsi.dalsi;
dispose(pom.dalsi);
pom.dalsi := pokracovani;

nebo si nejdriv uloz refernci na pom.dalsi, do pom.dalsi nastav pom.dalsi.dalsi a pak uvolni tu ulozenou referenci.

Jeste je v tom tvym kodu jedna logicka chyba

> while pom1^.dalsi <> nil do begin
> if pom1^.dalsi^.prazdny then begin

nemas tam podminku na to, jestli neni pom.prazdny. Takze pokud jako parametr dostanes treba jednoprvkovy seznam s prazdnym prvkem, tak ho nezjistis.

Citovat příspěvek

 

Rušení prvků v dynamickém seznamu

Autor: dr3ex

20:36:12 13.01.2011

Ahoj, připravuji se na zkoušku z algoritmizace a nemůžu přijít na řešení tohoto příkladu:

Mám dynamický jednosměrně řetězený seznam:

type
ukazatel = ^prvek;
prvek = record
prazdny: boolean;
dalsi: ukazatel;
end;

Mám napsat proceduru, která odstraní všechny prázdné prvky.

procedure OdstranPrazdne(var u: ukazatel);
var pom1, pom2: ukazatel;
begin
pom1 := u;
if pom1 <> nil do begin //test jestli není seznam prázdný
while pom1^.dalsi <> nil do begin
if pom1^.dalsi^.prazdny then begin
pom2 := pom1^.dalsi;
pom1 := pom2^.dalsi;
dispose(pom2);
end;
pom1 := pom1^.dalsi;
end;
end;
end;

Nedokážu pochopit proč tak, jak jsem to naprogramoval, to nefunguje. Dokáže někdo pomoci?

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: