![]() |
Re: einfach verkettete Liste
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:
Das verstehe ich nicht..wenn work =
while (work^.next<>NIL) do
begin Memo1.Lines.append(work^.inhalt); memo1.Lines.append(IntToStr(work^.Nummer)); work:=work^.next; end 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. |
Re: einfach verkettete Liste
sag mal, hast du dir mein beispiel angesehen?
![]() vergleich mal dieses beispiel:
Delphi-Quellcode:
mit deinem code...
while AktNode <> NIL do
begin Writeln('Node mit Data: ', AktNode.data); AktNode := Traverse(Aktnode); //Geht zum nächsten Knoten end; Zitat:
Delphi-Quellcode:
noch viel erfolg.
while work <> NIL do ...
|
Re: einfach verkettete Liste
Dein Beispiel ist echt gut. Vor allem hat man dank den funktionen einen besseren Überblick. Sollte ich wieder Listen in einem Projekt einbinden müssen dann werde ich diese Vorlage verwenden. Ich hab boß immer so ne macke, dass es mir irgendwann gar nicht mehr darauf ankommt ne Liste zu programmieren sondern nur noch den Fehler zu finden, warum ein bestimmtes Projekt nicht funktioniert. Den Fehler von Oben also vom Videotutorial habe ich auch gefunden und zwar, wenn ich ein Listenelement mit daten fülle, dann muss für dieses Listenelement der "work^.next"-Zeiger wieder auf NIL gesetzt werden denn wenn ein neues Element eingefügt wird dann sucht sich das Programm diesen Zeiger und reserviert den Speicherplatz und wenn dort schon was drin steht gibts probleme. Wobei das kein Fehler vom Videotutorial war sondern von mir.
|
Re: einfach verkettete Liste
Mal eine dumme Frage: wieso muss es eigentlich eine verkettete Liste sein, wo man doch auch eine TList verwenden könnte?
|
Re: einfach verkettete Liste
ja das ist so eie sache. wenn in der Klausur eine Aufgabe bekomme, programmieren sie eine verkettete Liste, dann macht sich das nicht so gut, wenn ich schreibe, ich nehme einfach TList :-D
|
Re: einfach verkettete Liste
Achso, dann will ich nichts gesagt haben :lol:
|
Re: einfach verkettete Liste
und vor allem ist TList eine ArrayList. Würde also als Lösung zur Aufgabe nichtmal stimmen.
|
Re: einfach verkettete Liste
Bei einer Verketteten Liste dürften auch die Einfüge und Lösch Proceduren schneller sein, als bei einem Array.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:12 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