Thema: Delphi einfach verkettete Liste

Einzelnen Beitrag anzeigen

malibu85

Registriert seit: 27. Dez 2007
45 Beiträge
 
#11

Re: einfach verkettete Liste

  Alt 1. Jan 2008, 15:33
Ein frohes neues Jahr wünsche ich euch,
ich habe mir erstaml das Videotutorial angeschaut welches mir wirklich eine Erleuchtung war. Sehr angenehm auf dieser Internetseite. Ich muss ganz ehrlich zugeben wenn man für so eine Hilfe geld zahlen müßte...ich würde es tun...großes lob auch an euch.

Ich habe die stelle an dem es um einfach verkettete Listen geht nach programmiert und glaube es auch soweit richtig zu haben. Im Prinzip läuft das Programm auch aber ich bekomme eine Fehlermeldung, welche ich erst ignorieren muss. Und zwar habe ich eine Zugriffsverletzung verursacht bei der Adresse 0453....

ich vermute das könnte vielleicht an den Hilfszeiger liegen (wrk bzw be mir work)
im ersten abschnitt erzeugen wir ein root. D.h. ein leeres Listenelement, welches als Markierer eigesetzt wird. Das Zeigerelement NEXT soll ja auf den Nachfolger zeigen aber bei root zeigt dieser ins NIL. Ist ja soweit okay. Danach fangen wir mit dem ersten Listenelement an und bezeichnen es als work- Work enthält den gleichen Inhalt wie root nur, dass work auch ein Nachfolger hat. Dann geht es los...mit der for-schleife werden die Nachfolger erzeugt. Alles soweit okay aber in der Ausgabe der Liste. definieren wir wieder einen Hilfszeiger der ach work heißt. Dieser bekommt die gleichen einstellungen wie der Markierer "root". root ist aber so zu sagen kein wirkliches Listenelement weil es keinen achfolger hat. Work ist ja das erste Listenelement. Bei der Ausgabe setzen wir work auf den Markierer. also ist worrk:=root; dann folgt eine schleife
Delphi-Quellcode:
while (work^.next<>NIL) do
begin
      Memo1.Lines.append(work^.inhalt);
      memo1.Lines.append(IntToStr(work^.Nummer));
      work:=work^.next;
end
Das verstehe ich nicht..wenn work =
root ist und root keinen Nachfolger hat wie soll man dann überhaupt auf de Pfad work^.inhalt kommen? denn work ist zwar mit root verknüpft am Anfang aber root ncht mit work. Okay das verstehe ich nicht so ganz. Sicher wird das auch nicht der Grund der Fehlermeldung sein aber kann es bei der Zugriffsverletung an den Hilfszeiger liegen?

hier noch mal der komplette Quellcode

Delphi-Quellcode:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Memo1: TMemo;
    procedure Button2Click(Sender: TObject);


    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

                           TYPE T_Zeiger = ^Liste;
                           Liste = Record
                           inhalt :string;
                           Nummer :integer;
                           next :T_Zeiger;
                           end;

var
  Form1: TForm1;

  root :T_Zeiger;
  Aktuell :T_Zeiger;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

  var
  work :T_Zeiger;
  I :Integer;
begin

  NEW(root);//-------------------------Erstes Listenelement erstellen root (Kopf)

      root^.next:=NIL;//---------------du hast keinen Nachfolger
      root^.inhalt:='Root-Element';//--root-Element enthält keine Daten
      root^.Nummer:=0;//---------------Nummer ist 0 da es nicht direkt zur Kette gehört sondern nur den Anfang markiert

      work:=root;//--------------------sagt nichts weiter aus, als das ein weiteres Element, die gleichen Inhalte trägt wie root..noch ist dieses Element nicht in der Liste


      for i:=1 to 10 do
      begin
      New(work^.next);//------------------------------ein neuer Speicherplatz für das neue Element wird erzeugt ..dem Nachfolger von ROOT
      work:=work^.Next;//-----------------------------auf das neu angelegte Element wechseln
      work^.inhalt:='Listenelement'+ IntToStr(i);//---Das Neue Element bekommt ein Inhalt
      work^.nummer:=i;//------------------------------Jedes Element erhält eine Nummer
      end;



end;






procedure TForm1.Button2Click(Sender: TObject);

var work:T_Zeiger;//------------------------------Hilfszeiger

begin

work:=root; //-----------------------------------------Hilfszeiger wird an den Anfang der Kette gesetzt

      while (work^.next<>NIL) do //--------------------Man hangelt sich so lange durch bis der Nachfolger NIL ist
      begin
      Memo1.Lines.append(work^.inhalt);
      memo1.Lines.append(IntToStr(work^.Nummer));
      work:=work^.next;

      end;

end;

end.
  Mit Zitat antworten Zitat