![]() |
Einfach Verkettete Liste
Hallo!
Wie kann ich den Speicherplatz einer einfach verketteten Liste frei geben?? PDaten = ^TDaten; TDaten = record info : TEinDatenSatz; next : PDaten; end; TEinDatenSatz = record ID : TID; Title : TTitle; end; Liste : PDaten; Wie gebe ich nun den Speicherplatz von Liste frei??? |
Re: Einfach Verkettete Liste
Indem du alle Zeiger freigibst:
Delphi-Quellcode:
zeiger:=Liste;
while zeiger<>nil do begin znaechster:=zeiger.next; dispose(zeiger); zeiger:=znaechster; end; |
Re: Einfach Verkettete Liste
Zitat:
Ich bekomme bei Dispose Folgenden Fehler!! First chance exception at $7C812A5B. Exception class EAccessViolation with message 'Access violation at address 00401B7B in module 'Aufgabe8.exe'. Write of address 425C3A46'. Process Aufgabe8.exe (2952)... Weiß einer warum??? |
Re: Einfach Verkettete Liste
Mal so geraten: Das Letzte Element hat keinen Nachfolger, den man lesen könnte.
|
Re: Einfach Verkettete Liste
Guten Morgen,
zeigt der Poiter für den Nachfolger des letzen Elementes auf nil? Wenn nicht, dann kracht es. Grüße Klaus |
Re: Einfach Verkettete Liste
Bei mir sieht es im Moment so aus!
Delphi-Quellcode:
Aber bei dispose(Marker) kommt immer ein Fehler!
Marker := Liste;
while Marker <> nil do Begin Naechster:=Marker.next; dispose(Marker); Marker:=Naechster; end; Wie kann ich denn den Nachfolger des letzten Elementes auf Nil setzen? Naechster ist ja der Nachfolger von Marker! ...also Ist Marker ---> Naechster.next oder was??? |
Re: Einfach Verkettete Liste
Zitat:
Normalerweise wird bei der Erstellung einer Liste immer der Nachfolger zuerst auf nil gesetzt, gibt es dann ein weiteres Element wird der Nachfolger auf diese Element gesetzt. Hier ist es ganz gut erklärt -> http://de.wikipedia.org/wiki/Liste_(Datenstruktur) Grüße Klaus |
Re: Einfach Verkettete Liste
Zeig doch mal den Code, wie du deine Liste überhaupt erstellst. Ich befürchte eher, dass dort bereits dein Problem liegt .
|
Re: Einfach Verkettete Liste
Eine einfache verkettete Liste sollte immer ein 'Dummy-Element' (HEAD) beinhalten, das auf das erste Element der Liste zeigt. Elemente werden immer zwischen HEAD und HEAD.next eingefügt. Da HEAD.next anfangs mit nil belegt ist, kann man nichts falsch machen:
Delphi-Quellcode:
Dann funktioniert der Löschcode auch.
Type
PLinkedList =^TLinkedList; TLinkedList = Record llNext : PLinkedList; llData : TInfo End; Var Head : PLinkedList; Procedure InitList; Begin New (Head); Head^.llNext := Nil; End; Procedure AddToList (aNodeInfo : TInfo); Var p : PLinkedList; Begin New (P); p^.llData := aNodeInfo; p^.llNext := HEAD^.llNext; Head^.llNext := p End; |
Re: Einfach Verkettete Liste
Das klappt bei mir alles nicht so wie ich will!
Ich bekomme immer wieder Fehler " Access Violation at Adress"!! Also ich habe meine Typdeklaration so!
Delphi-Quellcode:
TEinDatensatz ist so deklariert
type
PDaten = ^TDaten; TDaten = record info : TEinDatensatz; // Daten next : PDaten; // nächster end;
Delphi-Quellcode:
Nun hab ich mir eine Variable angelegt
TEinDatensatz = record
ID : TID; Title : TTitle; end;
Delphi-Quellcode:
Nun muss ich 2 Proceduren schreiben!
Liste: PDaten;
Die eine gibt den kompletten speicher wieder frei(Procedure).... und die andere schreibt ein Element vom typ TEinDatensatz in die Liste(Procedure--> auf Knopfdruck)! Das heißt das wenn auf einen Button gedrückt wird öffnet sich ein OpenDialog wo man eine Datei auswählen kann welche dann in die Liste geschrieben wird.Wenn man eine Datei angefügt hat und eine nächste reinschreiben möchte darf das alte natürlich nicht überschrieben werden?? :gruebel: Nur ich weiß nicht wie man das ganze jetzt umsetzt ohne diese lästigen Fehler immer zu bekommen?? :?: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:15 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