![]() |
Liste mit Zeigern
Hallo Leute!
Wir haben in der Schule mit Listen angefangen. Soweit ja ganz toll, nur verstehe ich nicht so ganz was ich da immer falsch mache. Unser Lehrer gibt aber auch keine klaren Auskünfte. Es gibt öfter Probleme, die nicht sein müssten. Falsche Funktionen etc... Nun zu meinem Problem. Wie kann ich dem Pc klarmachen, dass er Alle Elemente der Liste durchgeht bis zum letzten, dass dann auf Nil zeigt? Ist die Deklaration mit dem Anker überhaupt richtig?
Delphi-Quellcode:
Anmerkung:
type Pzeiger= ^Tmensch;
Tmensch = record n:string; z:pzeiger; end; var anker:pzeiger; procedure TForm1.FormCreate(Sender: TObject); begin new(anker); anker.z:=nil; end; procedure TForm1.Button1Click(Sender: TObject); var pak,pvor,pan:pzeiger; begin if anker.z=nil then begin new(pak); anker^.z:=addr(pak); pak^.n:=edit1.text; pak^.z:=nil; end else begin pak:=anker^.z; while pak<>nil do begin pak:=pak^.z; end; end; end; n im Record steht für einen Namen. Ich weis moment is der Quelltext noxh recht unübersichtlich, aber vll kann mir ja jemand sagen wo der Fehler liegt. Das Programm soll einfach namen in eine Liste schreiben. Imer ans Ende, wenn der aktuelle Datensatz nicht das letzte Element is soll er von Anfang an die Liste durchgehn bis zum letzten also bis der Zeiger auf Nil zeigt. |
Re: Liste mit Zeigern
Warum erzeugst du nur ein ein neues Element, wenn die Liste leer ist?
BTW. Stimmt das mit Delphi.Net? Dann sollte man auf Zeiger verzichten Es geht nichts über aussagekräftige Komponentenbezeichnungen (Button1) |
Re: Liste mit Zeigern
Zu Zeigern und Listen gibt es hier neuerdings ein
![]() |
Re: Liste mit Zeigern
Das Tutorial hat mir leider nicht viel geholfen.
Die eine Fehlermeldung ist zwar weg, aber dafür kommt die nächste. Wie gesagt wir bekommen ja keine Informationen von unserem Lehrer. ICh weis nur ich brauch einen Anfang, den er Anker annte, der kann ja am Anfang wenn noch nichts da ist auf nichts zeigen. Danach gebe ich das erste element ein
Delphi-Quellcode:
Dieses Wird wenn man es mit showmessage abfragt auch noch richtig wiedergegeben.
type Pzeiger= ^Tmensch;
Tmensch = record n:string; z:pzeiger; end; var anker:pzeiger; procedure TForm1.FormCreate(Sender: TObject); begin new(anker); anker.z:=nil; end; procedure TForm1.Button1Click(Sender: TObject); var pak,pvor,pan:pzeiger; begin if anker.z=nil then begin new(pak); anker^.z:=addr(pak); pak^.n:=edit1.text; pak^.z:=nil; end Jetzt fängt mein Problem an. Jetzt will ich ein weiteres Element anknüpfen. Ich gehe also zum sog. Anker und sehe nach worauf er zeigt. Also auf pak. Von dort aus sollen wir weiter überprüfen ob dieser auf ein weiteres glied zeigt oder ob es das letzte ist.
Delphi-Quellcode:
Wodraus ich auch nicht ganz schlau wurde, ist wann ich dieses ^ brauche und wann nicht. muss ich pan^.s:='string' schreiben oder geht auch pan.s:='string'??
else
begin pak:=anker^.z; while pak<>nil do begin new(pak); pak:=pak^.z; pan:=pak; end; new(pak); pak^.s:=Edit1.text; new(pan); pan^.z:=addr(pak); pak^.z:=nil; end; end; |
Re: Liste mit Zeigern
^ Vor der Variable heisst Zeiger auf Objekt, dahinter Objekt aus Zeiger
|
Re: Liste mit Zeigern
das heisst vor der Variabeln brauch ich es nur bei der Deklaration der Variabeln.
Hinter der Variabeln wenn ich aus einem Zeiger das Objekt erhalten möchte. und wenn ich es nicht schreibe, dann erwartet der pc einen Zeiger? also eine Anweisung, wohin er zeigen soll? |
Re: Liste mit Zeigern
Zitat:
Zitat:
Zitat:
|
Re: Liste mit Zeigern
Delphi-Quellcode:
type Pzeiger= ^Tmensch;
Tmensch = record n:string; z:pzeiger; // hier sollte die Adresse des nächsten Elementes stehen end; var anker:pzeiger; procedure TForm1.Button1Click(Sender: TObject); var pak,pvor,pan:pzeiger; begin if anker.z=nil then // hier fragst Du ob das AnkerElement einen Zeiger auf das nächste Element hat begin new(pak); anker^.z:=addr(pak); pak^.n:=edit1.text; pak^.z:=nil; end meiner Meinung nach wäre es so besser:
Delphi-Quellcode:
Zum Anhänge suchst Du dir das Element dessen Nachfolger nil ist:
type Pzeiger= ^Tmensch;
Tmensch = record n:string; naechster:pzeiger; end; var anker:pzeiger; procedure TForm1.Button1Click(Sender: TObject); var pak,pvor,pan:pzeiger; begin if anker = nil then // gibt es schon ein erstes Element? begin new(pak); anker := pak ; //das erste Element hat die Adresse von pak pak^.n:=edit1.text; pak^.naechster:=nil; // es gibt noch kein neues Element dager pak^.naechster := nil end
Delphi-Quellcode:
Grüße
procedure TForm1.addElement(s:String);
var list : pzeiger; dummy : pzeiger; begin list := anker; while list^.naechster <> nil do list := list^.naechster; // hier hat list^.naechster die Adress nil // damit hat list die Adresse des letzten Elementes new(dummy); dummy^.n:=string; dummy ^.naechster:=nil; list^.naechster := dummy; end; Klaus |
Re: Liste mit Zeigern
Vielen Dank Klaus!
Und natürlich auch an die Anderen. Jetzt versteh ich schon besser wie das mit dem Zeiger funktionieren soll. :thumb: Ich denke der rest wird sich ergeben, wenn wir weiter an programmen üben. nur noch eine Frage Klaus, wenn ich schreibe anker:=pak, was genau enthällt dan anker? anker ist ja ein zeiger, der auf ein record aus string und pointer zeigt. so jedenfalls haben wir es in der schule erklärt bekommen. Anker wäre doch dann ein Element der liste, genau wie pak, jedoch mit einem "besonderen namen", mit dem man anfängt. Oder sehe ich das falsch? :?: |
Re: Liste mit Zeigern
Anker ist ein Zeiger, der auf das erste Element der Liste zeigt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 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