AGB  ·  Datenschutz  ·  Impressum  







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

Einfach Verkettete Liste

Ein Thema von Stillmatic · begonnen am 12. Jun 2007 · letzter Beitrag vom 21. Jun 2007
Antwort Antwort
Seite 1 von 3  1 23      
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#1

Einfach Verkettete Liste

  Alt 12. Jun 2007, 19:14
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???
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Einfach Verkettete Liste

  Alt 12. Jun 2007, 19:19
Indem du alle Zeiger freigibst:
Delphi-Quellcode:
zeiger:=Liste;
while zeiger<>nil do
  begin
    znaechster:=zeiger.next;
    dispose(zeiger);
    zeiger:=znaechster;
  end;
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#3

Re: Einfach Verkettete Liste

  Alt 12. Jun 2007, 22:03
Zitat von Apollonius:
Indem du alle Zeiger freigibst:
Delphi-Quellcode:
zeiger:=Liste;
while zeiger<>nil do
  begin
    znaechster:=zeiger.next;
    dispose(zeiger);
    zeiger:=znaechster;
  end;

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???
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Einfach Verkettete Liste

  Alt 12. Jun 2007, 22:39
Mal so geraten: Das Letzte Element hat keinen Nachfolger, den man lesen könnte.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Klaus01

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

Re: Einfach Verkettete Liste

  Alt 13. Jun 2007, 06:34
Guten Morgen,

zeigt der Poiter für den Nachfolger des letzen Elementes auf nil?
Wenn nicht, dann kracht es.
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#6

Re: Einfach Verkettete Liste

  Alt 13. Jun 2007, 07:58
Bei mir sieht es im Moment so aus!

Delphi-Quellcode:
Marker := Liste;

  while Marker <> nil do
    Begin
      Naechster:=Marker.next;
      dispose(Marker);
      Marker:=Naechster;
    end;
Aber bei dispose(Marker) kommt immer ein Fehler!
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???
  Mit Zitat antworten Zitat
Klaus01

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

Re: Einfach Verkettete Liste

  Alt 13. Jun 2007, 08:06
Zitat von Stillmatic:
Bei mir sieht es im Moment so aus!

Delphi-Quellcode:
Marker := Liste; // hier sollte der Anfang der Liste sein

  while Marker <> nil do
    Begin
      Naechster:=Marker.next; // der Nachfolger vom Marker wird ermittelt
      dispose(Marker); // der Speicher für das Element Marker wird freigegeben
      Marker:=Naechster; // der Zeiger vom Nachfolger wird dem Marker Element übergeben
    end;
Aber bei dispose(Marker) kommt immer ein Fehler!
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???
Liste -> Marker,Nachfolger -> erstes Element,Nachfolger -> zweites Element,Nachfolger -> drittes Element,Nachfolger -> nil

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
Klaus
  Mit Zitat antworten Zitat
hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: Einfach Verkettete Liste

  Alt 13. Jun 2007, 08:57
Zeig doch mal den Code, wie du deine Liste überhaupt erstellst. Ich befürchte eher, dass dort bereits dein Problem liegt .
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Einfach Verkettete Liste

  Alt 13. Jun 2007, 09:32
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:
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;
Dann funktioniert der Löschcode auch.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#10

Re: Einfach Verkettete Liste

  Alt 13. Jun 2007, 11:50
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:
type
  PDaten = ^TDaten;
  TDaten = record
                  info : TEinDatensatz; // Daten
                  next : PDaten; // nächster
                end;
TEinDatensatz ist so deklariert

Delphi-Quellcode:
TEinDatensatz = record
               ID : TID;
               Title : TTitle;
             end;
Nun hab ich mir eine Variable angelegt
Liste: PDaten; Nun muss ich 2 Proceduren schreiben!
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??



Nur ich weiß nicht wie man das ganze jetzt umsetzt ohne diese lästigen Fehler immer zu bekommen??
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 16:04 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