|
Registriert seit: 27. Dez 2007 45 Beiträge |
#1
Hallo, sorry dass ich an einem Tag wie heute mit Listen nerven muss
![]() ich habe versucht eine Liste zu programieren, das Prinzip habe ich verstanden aber das Programm und ich snd uns da nicht ganz einig ![]() ich will mal kurz etwas aus dem Quelltext erklären. Für die Verkettung sorgt der Zeiger t_zeiger und für di listninhalte habe ich t_inhalt erzeugt
Delphi-Quellcode:
ich habe außerdem so eine Art Lesekopf erzeugt. Wer es vielleicht aus Turingmaschinen kennt. Dieser Kopf besteht aus
TYPE t_Zeiger = ^t_inhalt;
t_inhalt = Record inhalt :string; Next :t_Zeiger; Position :integer; End; (Kopf->steht auf dem ersten Element, Aktuell->steht immer auf dem Aktuellen Element und kann verschoben werden. Ende-> Steht immer auf dem letzten Element;
Delphi-Quellcode:
Kopf :t_Zeiger;
Aktuell :t_Zeiger; Ende :t_Zeiger ; Am Anfang des Quelltextes habe ich ein Haufen Ausgabeprozeduren sowie eine leere Liste erzeugt.Was aber nicht so wichtig ist. Es geht also erst so richtig los, sobald man auf Button 1 klickt. Das Programm prüft ob der Kopf leer istif (Kopf=NIL) then . Da dieser leer ist, wird ein Listenfeld (akt) erzeugt. Da akt ein Zeiger ist, kann man in dieses Listenfeld mit den folgenden befehlen Werte zuweisen
Delphi-Quellcode:
akt^.Next :=NIL;
akt^.inhalt :='Das ist das erste Leisenelement'; akt^.Position:=1; wenn jedoch schon ein Listenelement vorhanden ist, springt das Programm in die Else- schleife. Zuvor hatte ich gesagt das der Zeiger, der jedes Element mit seinem nachfolger verknüpfe soll, also akt^.Next :=NIL; ins leere zeigen soll. In der Else-Anweisung wird dieser Zeiger nicht mehr ins leere zeigen (NIL) sondern auf den Lesekopf Aktuell...er könnte auch auf den Lesekopf->Kopf oder auf den Lesekopf->Ende stehen aber Aktuell soll hier nur bewegt werden. Genauer gesagt soll dieser Wert nicht nur auf Aktuell zeigen sondern auf den Listeninhalt von Aktuell nämlich "next" Also Zeigt das Listenfeld von akt (dem 1.Listenfeld) auf ein ein mögliches neues Feld wobei es wiederum auf einen einen Zeiger zeigt, der wiederum wieder auf ein Zeiger zeigt (next) um das nicht ins endliche auszulagern wird gleich danach dem dem Zeiger wieder das Listenfeld akt zugeordnet.
Delphi-Quellcode:
Wenn also zwei mal auf dem Button geklickt wurde, müsste es meiner Meinung nach zwei Listenfelder geben,welche mit der variablen akt editiert werden können.Wenn man nun noch weitere mal auf den Butten 2 klickt müsste das Programm immer weitere Listeneinträge erzeugen, denn weil Kopf nicht mehr NIL ist springt das Programm gleich in die else anweisung. Da jedes Listenelement, das Zeigerelement akt^.next
kann diesem Element auch immer wieder der Wert Aktuell1.next
zugeordnet werden.akt^.next:=Aktuell^.next; Aktuell^.Next:=Akt; Mit den Prozeduren am Anfang habe ich die Ausgabe gemacht. Der Lesekopf besteht aus drei Teilen also habe ich drei Ausgaben erzeugt.
Delphi-Quellcode:
Das Programm funktoniert aber nicht so wie ich mir das gedacht habe. Denn irgendwie habe ich ein denkfehler. Ich habe zum Test in jedem Listenfeld eine ordinale Position eingefügt, welche sich bei jedem erzeugten Listenfeld incrementieren soll. Wenn man das Programm ausführt dann sieht mann, dass sich die Verkettung nicht im Lesekopf ->Aktuell fortsetzt sondern in allen drei. d.h ich bin mir jetzt gar nicht mehr so sicher ob jedes mal ein neues listenfeld erzeugt wird oder einfach nur die Position um 1 erhöht wird ( inc(akt^.position) ) Also eine pseudoverkettung die allein die Ausgabe vorgaukelt aber gar nicht existiert.
akt^.next:=Aktuell^.next;
Aktuell^.Next:=Akt; inc(akt^.position); p_Ausgabe_Kopf(Kopf^); p_Ausgabe_Aktuell(Aktuell^); p_Ausgabe_Ende(Ende^); Ich will ja eigentlich erreichen, dass nachdem genau ein Listenfeld erzeugt wurde und die Zeigervariablen Kopf,Aktuell,Ende auf eins stehen (weil janur ein Feld vorhanden ist) beim erzeugen eines zusätlichen Listenfelds sich hinter Kopf ein neues Listenfeld einfügt und sich nur für Aktuell und Ende die Position incrementiert. Warum geht das eigentlich nicht. Ich habe doch schließlich den pfad aktuell für die verkettung benutzt und nicht Kopf. Vielleicht hat ja jemand lust, mir bei meinen Problem zu helfen..ich stelle im folgenden nochmal den kompletten Quellcode rein
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Button2: TButton; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; TYPE t_Zeiger = ^t_inhalt; t_inhalt = Record inhalt :string; Next :t_Zeiger; Position :integer; End; var Form1: TForm1; Kopf :t_Zeiger; Aktuell :t_Zeiger; Ende :t_Zeiger ; implementation {$R *.dfm} procedure p_Ausgabe_Kopf (v_Kopf:t_inhalt); begin with form1 do with v_Kopf do begin label4.Caption:=IntToStr(position); end; end; procedure p_Ausgabe_Aktuell (v_Aktuell:t_inhalt); begin with form1 do with v_Aktuell do begin label5.Caption:=IntToStr(position); end; end; procedure p_Ausgabe_Ende (v_Ende:t_inhalt); begin with form1 do with v_Ende do begin label6.Caption:=IntToStr(position); end; end; procedure TForm1.Button1Click(Sender: TObject); begin Kopf :=NIL; Aktuell :=NIL; Ende :=NIL; label4.Caption:='leer'; label5.Caption:='leer'; label6.Caption:='leer'; end; procedure TForm1.Button2Click(Sender: TObject); var akt :t_Zeiger; vor :t_zeiger; pos :t_zeiger; begin New(akt); if (Kopf=NIL) then begin Kopf :=akt; Aktuell :=akt; Ende :=akt; akt^.Next :=NIL; akt^.inhalt :='Das ist das erste Leisenelement'; akt^.Position:=1; p_Ausgabe_Kopf(kopf^); p_Ausgabe_Aktuell(Aktuell^); p_Ausgabe_Ende(Ende^); end else //-------------------------------------------------------------- begin akt^.next:=Aktuell^.next; Aktuell^.Next:=Akt; inc(akt^.position); p_Ausgabe_Kopf(Kopf^); p_Ausgabe_Aktuell(Aktuell^); p_Ausgabe_Ende(Ende^); end; akt^.inhalt:='ein listen Element'; akt^.Position:=2; if (aktuell=ende) then begin ende:=akt; aktuell:=akt; end; end; end. |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |