![]() |
Re: Frage zu linearer Liste
So richtig wie im Tut isses nicht wirklich :zwinker:
In Liste steht doch das erste Element deiner Liste, wenn du nun diese Variable in einer Schleife direkt benutzt und deren Inhalt (per Liste := Liste.next; ) änderst, dann änderst du doch auch deren Inhalt und wenn die schleife bis NIL ( while tempListe <> nil do ) geht, dann steht danach NIL in Liste drin und deine Liste ist leer. du mußt also zur Benutzung deren Wert in eine 2 Variable speichern, deren Inhalt sich problemlos ändern kann ... somit bleibt der Inhalt der Variable Liste unverändert.
Delphi-Quellcode:
PS: die Variable i könnte einen verständlicheren Namen vertragen (z.B. NaechsteID, LetzteID, NextID oder so)
procedure TForm1.Button2Click(Sender: TObject); //Button für Listenausgabe
var tempListe: PListe; begin tempListe := Liste; while tempListe <> nil do begin Listbox1.Items.Add(inttostr(tempListe.key) + ': ' + tempListe.text); tempListe := tempListe.next; end; end; PSS: die Variable q ist doch eigentlich nur 'ner temoräre lokale Variable und sollte deswegen direkt in den Prozeduren (Button1Click, Button3Click, Button4Click und Button5Click) definiert sein. dein q entspricht hlp : PMYELEMENT; in dem Tut und tempListe entspricht sozusagen dem wrk : PMYELEMENT; |
Re: Frage zu linearer Liste
Ich bin nicht sicher, ob Du das Prinzip einer einfach verketteten Liste verstanden hast. Was Du auf jeden Fall brauchst, ist ein Zeiger auf das erste Element als globale Variable oder privates Feld des Formulars. Dieser ist bei Programmstart nil, da es ja noch kein Element gibt. Fügst Du nun ein neues Element am Listenende ein, musst Du zuallererst prüfen, ob dieser Zeiger belegt ist. Wenn nicht, bildet das neue Element den Anfang, sein Nachfolger ist dementsprechend nil. War das erste Element bereits belegt, musst Du den Zeigern folgen, um das letzte Element zu ermitteln. Dessen Nachfolger wird dann das neue Element, dessen Nachfolger dann wieder mit nil belegt wird.
|
Re: Frage zu linearer Liste
Achso ok danke ;)
Das is mal gut zu wissen ^^ So jetzt hab ich alles einmal geändert und mittlerweile hängt sich Delphi auf sobald ich. Der nicht funktionierende Quelltext sieht so aus:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject); //vor Key hinzufügen
var x: integer; templiste, q: PListe; begin x:= strtoint(edit2.Text); templiste := liste; while templiste <> nil do begin if templiste.key = x then begin i := i+1; new(q); q := liste; templiste.key := i; templiste.text := edit1.Text; templiste.next := q; end; templiste := templiste.next; end; end; procedure TForm1.Button5Click(Sender: TObject); //hinter Key hinzufügen var x: integer; templiste, q: PListe; begin x := strtoint(edit2.Text); templiste := liste; while templiste <> nil do begin if templiste.key <> x then begin i := i+1; new(q); q.next := templiste.next; templiste.next := q; q.key := i; q.text := edit1.Text; end; templiste := templiste.next; end; end; |
Re: Frage zu linearer Liste
Habe mal einige Kommentare eingefügt.
Delphi-Quellcode:
Eine Endlosschleife würde darauf hindeutem, dass in der Liste das letzte Element nicht auf nil zeigt.
procedure TForm1.Button5Click(Sender: TObject); //hinter Key hinzufügen
var x: integer; templiste, q: PListe; begin x := strtoint(edit2.Text); templiste := liste; // Was bezweckst Du hiermit? while templiste <> nil do begin // wenn temListe.key = x ist // dann wird an der aktuellen Position // ein Element eingefügt. // Soll das so sein? if templiste.key <> x then begin i := i+1; new(q); // wenn das neue Element an das Ende der Liste // angefügt wird, dann sollte q.next := nil q.next := templiste.next; templiste.next := q; q.key := i; q.text := edit1.Text; end; templiste := templiste.next; end; end; Habe mal noch etwa nachgedacht. Willst Du ein neues Element (q) vor bzw. nach einem bestehenden Element einfügen? Wenn dem so sein sollte, dann solltest Du mehrere Fälle unterscheiden. a) Du willst vor dem ersten Element ein Element einfügen, dann ändert sich die Adresse des ersten Elementes (Ancker)
Delphi-Quellcode:
b)Du willst nach dem letzen Element ein Element anhängen.
new(q);
q.next:=liste; Ancker := q; q...
Delphi-Quellcode:
b) Du willst innerhalb der Liste ein Element einfügen
new(q);
q.next := nil; liste.next := q; q... Dazu brauchst Du dann noch einen Buffer für das Element vor dem aktuellen Element.
Delphi-Quellcode:
new(q);
buf.next := q; q.next := liste; q... Grüße Klaus |
Re: Frage zu linearer Liste
k danke an alle die mir geholfen haben, ich glaube mittlerweile hab ich das Prinzip der Zeiger und somit der Listen verstanden :)
Einzig und allein vor einem Key einfügen endet weiterhin in einer (mir nicht erklärbaren) Endlosschleife :-/ @Klaus01: Jo es soll an dieser Stelle eingefügt werden und ich hab mittlerweile den Fehler gefunden (das ungleich einfach mit = vertauschen... :wall: ). Also nochmal zum vor dem Key hinzufügen: ich ordne jedem Listenelement eine Zahl zu und eben auf genau diese will ich hier zugreifen. Soll heißen ich will je nachdem vor (funktioniert nicht) oder nach (funktioniert) diesem Element einfügen. Der Quelltext sieht so aus:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject); //vor Key hinzufügen
var x: integer; templiste, buffer, q: PListe; begin x:= strtoint(edit2.Text); templiste := liste; while templiste <> nil do begin if templiste.key = x then begin i := i+1; new(q); q := templiste; templiste.key := i; templiste.text := edit1.Text; templiste.next := q; end; templiste := templiste.next; end; end; |
Re: Frage zu linearer Liste
was mir auf den ersten Blick auffällt ... du überschreibst das grade erst erstellte Q mit templist
Delphi-Quellcode:
new(q);
q := templiste; |
Re: Frage zu linearer Liste
Herzlich willkommen in der Delphi-PRAXiS, Churchy.
Wenn du ![]() Gruß Hawkeye |
Re: Frage zu linearer Liste
Dankeschön :)
Mittlerweile funktioniert das ganze Programm und ich bin euch echt dankbar für die Hilfe ^^ Kann von mir aus geschlossen werden ;) MfG Churchy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:49 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