Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Stack - erstes Element löschen (https://www.delphipraxis.net/120231-stack-erstes-element-loeschen.html)

spox 7. Sep 2008 12:48


Stack - erstes Element löschen
 
Hallo liebe DP! :)

Ich sitz gerade wieder vor einem Problem mit meinem Stack. Ich möchte das letzte Element eines Stapel löschen... Ich habe mir dafür eine Variable Hilf angelegt, die auf den Anfang des Stapels zeigt, damit ich den nicht verliere. Ich möchte den Stapel mit einer Schleife durchlaufen und das letzte Element dann disposen. Das Blöde hier dran ist nur, dass meine While-Schleife einfach nie zu Ende geht. Sie rattert pausenlos durch, was eine CPU-Auslastung von 100 % zur Folge hat. :gruebel:

Delphi-Quellcode:
procedure letztesloeschen(AStapel:PStapel);
var
  Hilf,temp:PStapel;
begin
  Hilf:= AStapel;
  While AStapel <> nil do temp:= AStapel^.next;
  Dispose(temp);
  AStapel:= Hilf;
end;
Die Prozedur ist in einer anderen Unit nur für Stapelprozeduren. Der Stapel wird durch den Parameter übergeben. Der Stapel wird beim Formcreate auf nil gesetzt.

Ich hoffe ihr könnt mir helfen :)

mkinzler 7. Sep 2008 12:52

Re: Stack - letztes Element löschen
 
Das letzte ist beim Stack doch das erste.

spox 7. Sep 2008 12:56

Re: Stack - letztes Element löschen
 
Da hast du natürlich Recht. Dann habe ich mich vielleicht falsch ausgedrückt. Ich will das erste Element entfernen. Praktisch das Element, das auf nil zeigt.

idontwantaname 7. Sep 2008 12:59

Re: Stack - letztes Element löschen
 
Hallo!

Ich möchte nur mal anmerken, dass du eine Endlosschleife hast ;)

Delphi-Quellcode:
While AStapel <> nil do temp:= AStapel^.next;
Es ändert sich doch rein gar nichts an der Schleifenbedingung, wenn du temp etwas zuweist -> sprich Endlosschleife.

mkinzler 7. Sep 2008 13:01

Re: Stack - letztes Element löschen
 
Es sollte doch .Prior sein oder?

spox 7. Sep 2008 13:02

Re: Stack - letztes Element löschen
 
und wie löse ich das Problem? :?
Der Stapel zeigt doch irgendwann auf nil. Nämlich dann, wenn das erste Element erreicht worden ist... Oder ist das nicht richtig? :gruebel:

@mkinzler: was heißt .Prior?

mkinzler 7. Sep 2008 13:05

Re: Stack - letztes Element löschen
 
Ich würde den Vorgänger (.Next) nicht Nachfolger (.Prior) nennen. Ist zwar egal, verwirrt aber.
Delphi-Quellcode:
While AStapel^.next <> nil

spox 7. Sep 2008 13:08

Re: Stack - letztes Element löschen
 
deine Lösung klappt nicht... ist trotzdem Endlos :?

Ich habe jetzt mal versucht, AStapel:= AStapel^.Next (
Delphi-Quellcode:
While AStapel <> nil do AStapel:= AStapel^.next;
) zu setzen. Aber das geht auch nicht, da es eine Adressverletzung sei. Bin echt ratlos...

mkinzler 7. Sep 2008 13:12

Re: Stack - letztes Element löschen
 
Bist du sicher, dass das Root-Element auf Nil zeigt

spox 7. Sep 2008 13:14

Re: Stack - letztes Element löschen
 
Ich setze den Stapel beim FormCreate auf nil. Der ganze Stapel sieht dann wie folgt aus:

Stapel -> nil (leerer Stapel)

nach Hinzufügen des ersten Elementes:

Stapel -> [Element 1] -> nil

nach Hinzufügen eines weiteren Elementes:

Stapel -> [Element 2] -> [Element 1] -> nil

...

UPDATE:

ich habs jetzt soweit hinbekommen, dass ich das letzte Element gelöscht hab (dispose). Das Problem an der Sache ist ja jetzt, dass das jetzt Letzte bzw. das vorher vorletzte immer noch auf das gelöschte zeigt. Das geht ja natürlich nicht. Deshalb gibts eine Fehlermeldung.

edit:

oh, danke Eddy :)
eine Frage dazu: bei Stapel^.next^.next rufst du das übernächste Element auf?

DeddyH 7. Sep 2008 13:47

Re: Stack - erstes Element löschen
 
Delphi-Quellcode:
while (Stapel^.next <> nil) and (Stapel^.next^.next <> nil) do
  Stapel := Stapel^.next;
temp := Stapel^.next;
Stapel^.next := nil;
Dispose(temp);
Ich hoffe, ich habe keinen Denkfehler dabei gemacht.

[edit] Doch, habe ich. Bei weniger als 2 Elementen haut das so nicht hin. Aber der Ansatz müsste zumindest richtig sein. [/edit]

spox 7. Sep 2008 13:55

Re: Stack - erstes Element löschen
 
oh, danke Deddy :)
eine Frage dazu: bei Stapel^.next^.next rufst du das übernächste Element auf?

Man kann ja auch eine Abfrage einbauen. Dann klappt das auch bei weniger als 2 Elementen. :)

Meine Lösung war bisher noch
Delphi-Quellcode:
procedure letztesloeschen(AStapel:PStapel);
var
  Hilf:PStapel;
begin
  Hilf:= AStapel;
  While Hilf^.next <> nil do Hilf:= Hilf^.next;
  Dispose(Hilf);
end;
Aber dann hab ich das Problem, dass das jetzt erste Element, auf das gerade gelöschte zeigt.

DeddyH 7. Sep 2008 14:23

Re: Stack - erstes Element löschen
 
Ich habe mir gedacht, ich bleibe beim "vorletzten" Element stehen, da ich ja das letzte löschen will.

marabu 7. Sep 2008 14:40

Re: Stack - erstes Element löschen
 
Hallo Leute,

man kann einen Stapel auf der Basis einer einfach verketteten Liste implementieren und man kann in einer solchen Liste auch ein beliebiges Element löschen, aber dann spricht man nicht mehr von einem Stapel - der kennt nur PUSH, POP, PEEK, ISEMPTY, CLEAR. Auch wenn hier ohne Klassen implementiert wird, sollte man die beiden Abstraktionsebenen LISTE und STAPEL sauber auseinander halten. Und auch PStapel = ^TZettel ist ein Stilfehler.

Delphi-Quellcode:
type
  PZettel = ^TZettel;
  TZettel = record
    inhalt: string;
    next: PZettel;
  end;

var
  stapel: PZettel;
Hier sind noch eine Reihe von handwerklichen Fehlern enthalten, aber ich fürchte, dass das in diesem Thread nicht so sehr von Interesse ist.

Freundliche Grüße

Klaus01 7. Sep 2008 16:46

Re: Stack - erstes Element löschen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Abend,

ein Bild sagt mehr als tausend Worte....

Wer mehr Infos zu Stapel, Kellerautomaten und lifo (Last in First out) haben möchte
kann gerne mal hier schauen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz