Spojový seznam - odebrání prvku/prvků s maximální hodnotou – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Spojový seznam - odebrání prvku/prvků s maximální hodnotou – Pascal – Fórum – Programujte.comSpojový seznam - odebrání prvku/prvků s maximální hodnotou – Pascal – Fórum – Programujte.com

 
Hledat
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Pergoly a střechy Brno

arden890
Duch
28. 12. 2021   #1
-
0
-

Ahoj,

snažím se vytvořit proceduru, která by mi měla ze spojového seznamu vynechat všechny prvky, které osahují maximální hodnotu z celého seznamu.

Něco jsem napsal, ale procedura mi padá:

type Ukazatel = ^Prvek;
     Prvek = record Dalsi: Ukazatel;
                    Hodnota: integer;
             end;

procedure Vynech_nejvetsi;
          var Pomocna,Pruchod,Zacatek,Konec: Ukazatel;
              Nejvetsi: integer;
          begin
               while Pomocna <> nil do
                                  Pomocna:= Zacatek;
                                  if Pomocna^.Dalsi^.Hodnota > Pomocna^.Hodnota then Nejvetsi:= Pomocna^.Dalsi^.Hodnota;
               while Pomocna <> nil do
                                  Pruchod:= Pomocna^.Dalsi;
                                  if Pomocna^.Hodnota = Nejvetsi then begin
                                                                           if Konec = Zacatek then
                                                                                                  while Pomocna <> nil do begin
                                                                                                                               dispose(Konec);
                                                                                                                               Zacatek:= nil;
                                                                                                                               Konec:= nil;
                                                                                                                          end
                                                                                              else if Konec <> Zacatek then
                                                                                                                           while Pomocna <> nil do begin
                                                                                                                                                        Pruchod:= Zacatek;
                                                                                                                                                        Zacatek:= Zacatek^.Dalsi;
                                                                                                                                                        dispose(Pruchod);
                                                                                                                                                        Pruchod:= nil;
                                                                                                                                                   end
                                                                  else if Pruchod^.Hodnota = Nejvetsi then begin
                                                                                                                Pruchod:= Pomocna^.Dalsi;
                                                                                        Pomocna^.Dalsi:= Pruchod^.Dalsi;
                                                                                        dispose(Pruchod);
                                                                                                           end;
                                                                      end;
          end;

Už si nevím rady. Poradil byste mi někdo prosím? Předem moc děkuji.
 

Nahlásit jako SPAM
IP: 2a00:1028:96d2:cb3a:d845:8b60:93f2:74ae...–
MilanL
~ Anonymní uživatel
994 příspěvků
28. 12. 2021   #2
-
0
-

#1 arden89
pro příště vkládej kód pomocí menu "<?"

1. na začátku procedury, je potřeba vložit do proměnné Zacatek ukazatel na první prvek (ideálně jako vstupní parametr procedury), ten si musíš v programu nějak zapamatova jinak to ztrácí smysl.

2. a v prvním while bys měl testovat Pomocna^.Dalsi <> nill

Nahlásit jako SPAM
IP: 91.139.9.–
arden890
Duch
28. 12. 2021   #3
-
0
-

Děkuji za rady. Proceduru jsem se pokusil upravit:

procedure Vynech_nejvetsi;

var Pomocna, Pruchod, Zacatek: Ukazatel;
    Nejvetsi: integer;

begin

while Pomocna^.Dalsi <> nil do begin
                              Pomocna:= Zacatek;
 if Pomocna^.Dalsi^.Hodnota > Pomocna^.Hodnota then Nejvetsi:= Pomocna^.Dalsi^.Hodnota;
                               end;

while Pomocna <> nil do begin
                       Pruchod:= Pomocna;
                       if Pomocna^.Hodnota = Nejvetsi then begin
							      Pomocna:= Pruchod^.Dalsi;
                                                              Pruchod^:= Pomocna^;
                                                              Pruchod:= Pomocna^.Dalsi;                                                                      
                                                              dispose(Pomocna);
                                                              Pomocna:= Pruchod;
                                                           end
                                                      else begin
                                                              Pomocna:= Pomocna^.Dalsi;
                                                              Pruchod:= Pomocna;
                                                           end;

                        end;
end;

Takto mi to dává smysl, přesto to ale nefunguje. Nevíte prosím, co dělám špatně?

Děkuji

Nahlásit jako SPAM
IP: 2a00:1028:96d2:cb3a:8d3a:9958:d223:ed2a...–
gna
~ Anonymní uživatel
1643 příspěvků
29. 12. 2021   #4
-
0
-

Těm proměnným musíš nejdřív nastavit nějakou hodnotu a přinejmenším Zacatek bude asi parametr té procedury.

procedure Vynech_nejvetsi(var Zacatek: Ukazatel);
var
    Pruchod, Predchozi, Dalsi: Ukazatel;
    Nejvetsi: integer;
begin
    if Zacatek = nil then
        Exit;

    Nejvetsi := Zacatek^.Hodnota;
    Pruchod := Zacatek^.Dalsi;
    while Pruchod <> nil do begin
        if Pruchod^.Hodnota > Nejvetsi then
            Nejvetsi := Pruchod^.Hodnota;
        Pruchod := Pruchod^.Dalsi;
    end;

    Predchozi := nil;
    Pruchod := Zacatek;
    while Pruchod <> nil do begin
        Dalsi := Pruchod^.Dalsi;

        if Pruchod^.Hodnota = Nejvetsi then begin
            Dispose(Pruchod);
            if Predchozi <> nil then
                Predchozi^.Dalsi := Dalsi;
            if Pruchod = Zacatek then
                Zacatek := Dalsi;
        end
        else begin
            Predchozi := Pruchod;
        end;

        Pruchod := Dalsi;
    end;
end;
Nahlásit jako SPAM
IP: 213.211.51.–
arden890
Duch
29. 12. 2021   #5
-
0
-

#4 gna
Díky moc, proceduru jsem si podle tvého návrhu upravil a funguje.

Nahlásit jako SPAM
IP: 2a00:1028:96d2:cb3a:8d06:71ba:15ea:d0e2...–
Zjistit počet nových příspěvků

Přidej příspěvek

×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, 5 hostů

Moderátoři diskuze

 

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