AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Liste mit Zeigern

Ein Thema von Damaster · begonnen am 21. Apr 2008 · letzter Beitrag vom 21. Apr 2008
Antwort Antwort
Seite 1 von 2  1 2      
Damaster

Registriert seit: 26. Nov 2007
14 Beiträge
 
#1

Liste mit Zeigern

  Alt 21. Apr 2008, 16:31
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:
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;
Anmerkung:
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Liste mit Zeigern

  Alt 21. Apr 2008, 16:36
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)
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.548 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Liste mit Zeigern

  Alt 21. Apr 2008, 16:44
Zu Zeigern und Listen gibt es hier neuerdings ein Tutorial
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Damaster

Registriert seit: 26. Nov 2007
14 Beiträge
 
#4

Re: Liste mit Zeigern

  Alt 21. Apr 2008, 19:01
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:
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
Dieses Wird wenn man es mit showmessage abfragt auch noch richtig wiedergegeben.
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:
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;
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'??
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Liste mit Zeigern

  Alt 21. Apr 2008, 19:04
^ Vor der Variable heisst Zeiger auf Objekt, dahinter Objekt aus Zeiger
Markus Kinzler
  Mit Zitat antworten Zitat
Damaster

Registriert seit: 26. Nov 2007
14 Beiträge
 
#6

Re: Liste mit Zeigern

  Alt 21. Apr 2008, 19:12
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Liste mit Zeigern

  Alt 21. Apr 2008, 19:15
Zitat:
das heisst vor der Variabeln brauch ich es nur bei der Deklaration der Variabeln.
Und um eine Zeiger auf ein Objekt zu erhalten.
Zitat:
Hinter der Variabeln wenn ich aus einem Zeiger das Objekt erhalten möchte.
Ja
Zitat:
und wenn ich es nicht schreibe, dann erwartet der pc einen Zeiger? also eine Anweisung, wohin er zeigen soll?
Ja
Markus Kinzler
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.757 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Liste mit Zeigern

  Alt 21. Apr 2008, 19:23
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:
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
Zum Anhänge suchst Du dir das Element dessen Nachfolger nil ist:

Delphi-Quellcode:
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;
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Damaster

Registriert seit: 26. Nov 2007
14 Beiträge
 
#9

Re: Liste mit Zeigern

  Alt 21. Apr 2008, 19:45
Vielen Dank Klaus!
Und natürlich auch an die Anderen. Jetzt versteh ich schon besser wie das mit dem Zeiger funktionieren soll.
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Liste mit Zeigern

  Alt 21. Apr 2008, 19:50
Anker ist ein Zeiger, der auf das erste Element der Liste zeigt.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 Uhr.
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