AGB  ·  Datenschutz  ·  Impressum  







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

Frage zu linearer Liste

Ein Thema von Churchy · begonnen am 1. Feb 2009 · letzter Beitrag vom 2. Feb 2009
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#11

Re: Frage zu linearer Liste

  Alt 1. Feb 2009, 18:58
So richtig wie im Tut isses nicht wirklich

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:
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;
PS: die Variable i könnte einen verständlicheren Namen vertragen (z.B. NaechsteID, LetzteID, NextID oder so)

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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#12

Re: Frage zu linearer Liste

  Alt 1. Feb 2009, 19:00
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Churchy

Registriert seit: 1. Feb 2009
7 Beiträge
 
#13

Re: Frage zu linearer Liste

  Alt 1. Feb 2009, 19:20
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;
  Mit Zitat antworten Zitat
Klaus01

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

Re: Frage zu linearer Liste

  Alt 1. Feb 2009, 20:52
Habe mal einige Kommentare eingefügt.

Delphi-Quellcode:
    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;
Eine Endlosschleife würde darauf hindeutem, dass in der Liste das letzte Element nicht auf nil zeigt.

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:
new(q);
q.next:=liste;
Ancker := q;
q...
b)Du willst nach dem letzen Element ein Element anhängen.
Delphi-Quellcode:
new(q);
q.next := nil;
liste.next := q;
q...
b) Du willst innerhalb der Liste ein Element einfügen
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
Klaus
  Mit Zitat antworten Zitat
Churchy

Registriert seit: 1. Feb 2009
7 Beiträge
 
#15

Re: Frage zu linearer Liste

  Alt 1. Feb 2009, 22:56
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... ).

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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#16

Re: Frage zu linearer Liste

  Alt 1. Feb 2009, 23:09
was mir auf den ersten Blick auffällt ... du überschreibst das grade erst erstellte Q mit templist

Delphi-Quellcode:
new(q);
q := templiste;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#17

Re: Frage zu linearer Liste

  Alt 1. Feb 2009, 23:16
Herzlich willkommen in der Delphi-PRAXiS, Churchy.

Wenn du diese Seite gelesen hast, wirst du sehen, dass du bei der einfach verketteten Liste zum Einfügen von Elementen einen Hilfszeiger benötigst.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Churchy

Registriert seit: 1. Feb 2009
7 Beiträge
 
#18

Re: Frage zu linearer Liste

  Alt 2. Feb 2009, 00:15
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 05:41 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