pascal a razeni ve spojovych seznamech

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

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

Odeslat příspěvekod quaker 23. 4. 2005 06:20

pro znalce pascalu:
potrebuji najit chybu, delam nad timhle trochu dele a ne a ne ji najit.
Potrebuji udelat razeni ve spojovem seznamu a to jen pomoci presmerovani adres. Do packalu moc nedelam tak prosim o zhovivavost a velke nakopnuti

Kód: Vybrat vše
program du2_sort;
{serazeni prvku ve strukture a to pouze presmerovanim addr}
uses crt;

type
  thodnota=integer;
  spoj= ^prvek;
  prvek = record
            hodnota:thodnota;
            dalsi:spoj;
          end;

procedure pridej(var celo,konec:spoj; hodnota:thodnota);
var
p:spoj;
begin
new(p);
p^.hodnota:=hodnota;
p^.dalsi:=nil;
if celo = nil then celo:=p
               else konec^.dalsi:=p;
konec:=p;
end;

procedure tisk(celo:spoj);
begin
while celo <> nil do
   begin
     write(celo^.hodnota:5);
     celo:=celo^.dalsi;
   end;
writeln;
end;

procedure serad(var celo:spoj);
var
pom:spoj;
p1,p2:spoj;
vymena:boolean;
begin
vymena:=true;
while vymena do
   begin
     vymena:=false;
     p1:=celo;
     if p1<> nil then begin
                        p2:=p1;
                        p1:=p1^.dalsi;
                      end;
     p2:=celo;
     p1:=p2^.dalsi;
     while p1 <> nil do
       begin
         if p2^.hodnota > p1^.hodnota then begin
                                             pom:=p1^.dalsi;
                                             p1^.dalsi:=p2^.dalsi;
                                             p2^.dalsi:=pom;
                                             vymena:=true;
                                           end;
         p2:=p1;
         p1:=p1^.dalsi;
       end;
     end;
end;

procedure uvolni(celo:spoj);
var
pom:spoj;
begin
while celo <> nil do
begin
   pom:=celo;
   celo:=celo^.dalsi;
   dispose(pom);
end;
end;

var
celo,konec:spoj;
i,n,m:integer;



begin
clrscr;
randomize;
write('Zadej pocet generovanych prvku: ');
readln(n);
write('Zadej maximalni hodnotu prvku: ');
readln(m);

celo:=nil;
for i:=1 to n do pridej(celo,konec,random(m)+1);

writeln('Vygenerovana: ');
tisk(celo);

writeln;
writeln('Serazena pomoci presmerovani adres:');
serad(celo);
tisk(celo);
uvolni(celo);
readln;
end.
quaker
Kolemjdoucí

Odeslat příspěvekod tom-cz 23. 4. 2005 07:30

nevim proč řazení děláš složitě když to jde jednoduše, ale budiž. nechce se mi to studovat, jen jsem to projel a tohle mě docela zaráží:
Kód: Vybrat vše
p1:=celo;
     if p1<> nil then begin
                        p2:=p1;
                        p1:=p1^.dalsi;
                      end;
     p2:=celo;
     p1:=p2^.dalsi;

to co děláš v tý podmínce se ti stejně potom natvrdo nastaví za ní.
tom-cz
Junior
Uživatelský avatar

Odeslat příspěvekod quaker 23. 4. 2005 07:42

hmm, tohle jsem prehlid, ale nejdulezitejsi je - a to mi dela problem
Kód: Vybrat vše
while p1 <> nil do
       begin
         if p2^.hodnota > p1^.hodnota then begin
                                             pom:=p1^.dalsi;
                                             p1^.dalsi:=p2^.dalsi;
                                             p2^.dalsi:=pom;
                                             vymena:=true;
                                           end;
         p2:=p1;
         p1:=p1^.dalsi;
       end;
     end;
quaker
Kolemjdoucí

Odeslat příspěvekod quaker 23. 4. 2005 19:29

diky za pomoc, problem byl vyresen
quaker
Kolemjdoucí


Kdo je online

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