Delphi-PRAXiS
Seite 4 von 7   « Erste     234 56     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Zeigern (https://www.delphipraxis.net/109409-problem-mit-zeigern.html)

praesident 29. Feb 2008 20:53

Re: Problem mit Zeigern
 
Zitat:

Zitat von DeddyH
Nö, ist kein Aufwand, dann mach es so, wie Du selbst schon gesagt hast:
Delphi-Quellcode:
PROCEDURE push(VAR zkopf:tzeiger;inhalt:char);
VAR zhilf, zneu:tzeiger;
BEGIN
  //erstes Element soll angelegt werden
  if zkopf = nil then
    begin
      new(zhilf);
      zhilf^.inhalt := inhalt;
      zhilf^.next := nil;
      zkopf := zhilf;
    end
  //eine weiteres Element soll angehängt werden
  else
    begin
      zhilf:=zkopf;
      while (zhilf <> nil) and (zhilf^.next <> nil) do
          zhilf:=zhilf^.next;
      new(zneu);
      zneu^.inhalt:=inhalt;
      zneu^.next:=NIL;
      zhilf^.next:=zneu;
    end;
END;

genau, danke...ich hoffe jetzt pack ich auch was allein

DeddyH 29. Feb 2008 20:56

Re: Problem mit Zeigern
 
[OT] Gibt es hier eigentlich noch kein Tut zu einfach/doppelt verketteten Listen? Wäre ja mal 'ne schöne Gelegenheit, sich mit seinem neuen Delphi vertraut zu machen :mrgreen: [/OT]

grenzgaenger 29. Feb 2008 21:54

Re: Problem mit Zeigern
 
tja, mal 'n hinweis, hier wird das thema auch behandelt: hier

ausserdem gibts massenweise threads und tutorials über verkettete listen z.b.Hier im Forum suchenverkettete listen, In der Entwickler-Ecke suchenverkettete listen, Bei Google suchenverkettete listen

DeddyH 29. Feb 2008 22:07

Re: Problem mit Zeigern
 
Also, Tuts hab ich auf Anhieb keine entdeckt, und bei den meisten (aktuellen) gefundenen Threads innerhalb der DP war ich selbst beteiligt ;)

praesident 29. Feb 2008 22:54

Re: Problem mit Zeigern
 
ich hab noch ein kleines problem...

und zwar, wenn ich nun eine zweite liste erzeuge und dort soll die erste in umgekehrter reihenfolge hineingeschrieben werden.....

dafür habe ich zkopf und zkopf2 in der ersten unit deklariert...die waren vorher gar nicht deklariert

allerdings bekomme ich jetzt immer diese fehlermeldung: [Fehler] Unit1.pas(51): Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen


hier nocheinmal die zugehörige Prozedur:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
VAR laeng,i:byte;
    zkopf,zkopf2 :tzeiger;
begin
  init(zkopf);
  laeng:=length(edit1.Text);
  FOR i:=1 TO laeng DO
     push(zkopf,edit1.text[i]);

  init(zkopf2);
  FOR i:=1 TO laeng DO
     push(zkopf2,pop(zkopf));
  edit1.text:=top(zkopf2);
end;
die pop-funktion:

Delphi-Quellcode:
FUNCTION pop(VAR zkopf:tzeiger):char;
VAR zhilf1,zhilf2:tzeiger;
    z:char;
BEGIN
 zhilf1:=zkopf;
 zhilf2:=zkopf^.next;
 WHILE NOT(zhilf2^.next = NIL) DO
  BEGIN
   zhilf1:=zhilf2;
   zhilf2:=zhilf2^.next;
  END;
  zhilf1^.next:=NIL;
  pop:=zhilf2^.inhalt;
END;


und die im vorigen teil besprochene push prozedur:

Delphi-Quellcode:
PROCEDURE push(VAR zkopf:tzeiger;inhalt:char);
VAR zhilf, zneu:tzeiger;
BEGIN
  //erstes Element soll angelegt werden
  if zkopf = nil then
    begin
      new(zhilf);
      zhilf^.inhalt := inhalt;
      zhilf^.next := nil;
      zkopf := zhilf;
    end
  //eine weiteres Element soll angehängt werden
  else
    begin
      zhilf:=zkopf;
      while (zhilf <> nil) and (zhilf^.next <> nil) do
          zhilf:=zhilf^.next;
      new(zneu);
      zneu^.inhalt:=inhalt;
      zneu^.next:=NIL;
      zhilf^.next:=zneu;
    end;

END;
danke

Macci 29. Feb 2008 23:29

Re: Problem mit Zeigern
 
Würde statt

Delphi-Quellcode:
FUNCTION pop(VAR zkopf:tzeiger):char;
VAR zhilf1,zhilf2:tzeiger;
    z:char;
BEGIN
zhilf1:=zkopf;
zhilf2:=zkopf^.next;
WHILE NOT(zhilf2^.next = NIL) DO
  BEGIN
   zhilf1:=zhilf2;
   zhilf2:=zhilf2^.next;
  END;
  zhilf1^.next:=NIL;
  pop:=zhilf2^.inhalt;
END;

nicht einfach nur

Delphi-Quellcode:
FUNCTION pop(VAR zkopf:tzeiger):char;
BEGIN
result:=zkopf^.inhalt;
zkopf := zkopf^.next
END;
genügen?

Macci 29. Feb 2008 23:31

Re: Problem mit Zeigern
 
Achso, nein würde es nicht, weil du ja keine FIFO-Schlage sondern einen LIFO-Keller willst. Sorry ;-)

Allerdings würde mein Vorschlag passen, wenn du für das Push auch eine entsprechende Prozedur verwenden würdest, die das neue Element am Anfang einfügt, die übrigens viel einfacher wäre.

praesident 29. Feb 2008 23:34

Re: Problem mit Zeigern
 
Zitat:

Zitat von Macci
Würde statt

Delphi-Quellcode:
FUNCTION pop(VAR zkopf:tzeiger):char;
VAR zhilf1,zhilf2:tzeiger;
    z:char;
BEGIN
zhilf1:=zkopf;
zhilf2:=zkopf^.next;
WHILE NOT(zhilf2^.next = NIL) DO
  BEGIN
   zhilf1:=zhilf2;
   zhilf2:=zhilf2^.next;
  END;
  zhilf1^.next:=NIL;
  pop:=zhilf2^.inhalt;
END;

nicht einfach nur

Delphi-Quellcode:
FUNCTION pop(VAR zkopf:tzeiger):char;
BEGIN
result:=zkopf^.inhalt;
zkopf := zkopf^.next
END;
genügen?

nein, würde ich jetzt nicht sagen...

denn, wenn zkopf das erste element ist und pop jeweils das letzte entfernen und freigeben soll muss ich ja solange in der liste weitergehen, bis ein element auf nil zeigt, oder?

bei mir hängts im moment an der letzten zeile der pop prozedur

Delphi-Quellcode:
FUNCTION pop(VAR zkopf:tzeiger):char;
VAR zhilf1,zhilf2:tzeiger;

BEGIN
 zhilf1:=zkopf;
 zhilf2:=zkopf^.next;
 WHILE (zhilf2 <> nil) AND (zhilf2^.next <> NIL) DO
  BEGIN
   zhilf1:=zhilf2;
   zhilf2:=zhilf2^.next;
  END;
  zhilf1^.next:=NIL;
  pop:=zhilf2^.inhalt;
END;
es kommt wieder jedesmal ein exeption fehler

Macci 29. Feb 2008 23:36

Re: Problem mit Zeigern
 
Schau mal, so klappts:

Delphi-Quellcode:
PROCEDURE push(VAR zkopf:tzeiger;inhalt:Char);
var zhilf:tzeiger;
BEGIN
new(zhilf);
zhilf^.inhalt:=inhalt;
zhilf^.next:=zkopf;
zkopf:=zhilf
END;

FUNCTION pop(VAR zkopf:tzeiger):char;
BEGIN
result:=zkopf^.inhalt;
zkopf := zkopf^.next
END;

Hab ich erfolgreich gesetet mit:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var tmp:tzeiger;
begin
push(tmp,'a');
push(tmp,'b');
push(tmp,'c');
showmessage(pop(tmp));  //c
showmessage(pop(tmp));  //b
showmessage(pop(tmp));  //a
end;

praesident 29. Feb 2008 23:39

Re: Problem mit Zeigern
 
Zitat:

Zitat von Macci
Achso, nein würde es nicht, weil du ja keine FIFO-Schlage sondern einen LIFO-Keller willst. Sorry ;-)

Allerdings würde mein Vorschlag passen, wenn du für das Push auch eine entsprechende Prozedur verwenden würdest, die das neue Element am Anfang einfügt, die übrigens viel einfacher wäre.

ich weiß nicht, ich glaube wir sollten das aus i-einem grund immer am ende einfügen...den sinn seh ich aber grad auch nicht

probiers gleich mal mit deiner vorgeschlagenen prozedur


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:39 Uhr.
Seite 4 von 7   « Erste     234 56     Letzte »    

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