Autor Beitrag
mitnick
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mo 12.03.07 20:39 
Hi community,
also wir sollten dieses Programm für den info-unterricht schreiben udn nun komm ich nicht weiter bidde helft mir.
Wir sollten einen doppelt verkettet Liste programmiern, bei der jeweils die erste Zahl gelöscht werden kann oder einen beliebige Zahl und eine beliebige Zahl eingefügt werden kann.



So Bild der Oberfläche:

[url=imageshack.us]user defined image[/URL]




Quellcode:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
begin {unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, Grids, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Enter: TBitBtn;
    Eingeben: TEdit;
    StringGrid1: TStringGrid;
    Remove: TBitBtn;
    Anfang: TEdit;
    Label1: TLabel;
    Ende: TEdit;
    Label2: TLabel;
    Leeren: TButton;
    Button1: TButton;
    beliebig: TEdit;
    Button2: TButton;
    StringGrid2: TStringGrid;
    procedure EnterClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);

    procedure RemoveClick(Sender: TObject);
    procedure LeerenClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
  
  public
    { Public-Deklarationen }

  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

type
     TInhalt  = string;
     TZeiger  = ^TElement;
     TElement = record
        Daten  : TInhalt;
        ToNext : TZeiger;
        ToLast: TZeiger;
     end;

var ToAnfang : TZeiger;
    ToEnde   : TZeiger;
    ZNeu     : TZeiger;
    ZNeu1    : TZeiger;
    ZAb      : TZeiger;
    Lauf     : TZeiger;
    Lauf2    : TZeiger;
//  ZDel     : TZeiger;
    Zac      : TZeiger;
    Zad      : TZeiger;

procedure TForm1.FormCreate(Sender: TObject);
begin
   new(ToAnfang);
   new(ToEnde);
   ToAnfang:= NIL;
   ToEnde := NIL;
end;

Procedure Loesche();
var i : integer;
begin
  for i:= 0 to 21 do Form1.StringGrid1.Cells[i,0]:= '';
  for i:= 0 to 21 do Form1.StringGrid2.Cells[i,0]:= '';
end;

procedure Ausgabe();
var i : integer;
begin
  i:= 0;
  Lauf:= ToAnfang;
  while lauf <> NIL do
  begin
    Form1.StringGrid1.cells[i,0]:= Lauf^.Daten;
    i:= i+1;
    Lauf:= Lauf^.ToNext;
  end;
end;

procedure Ausgabe2();
var i : integer;
begin
  i:= 0;
  Lauf2:= ToEnde;
  while Lauf2 <> NIL do
  begin
    Form1.StringGrid2.cells[i,0]:= Lauf2^.Daten;
    i:= i+1;
    Lauf2:= Lauf2^.ToLast;
  end;
end;
procedure TForm1.EnterClick(Sender: TObject);
begin
   new(ZNeu);
   new(ZNeu1);
   ZNeu^.Daten:=Eingeben.Text;
   ZNeu1^.Daten:=Eingeben.Text;
   ZNeu^.ToNext := Zneu;
   ZNeu^.ToLast := Zneu;
   ZNeu1^.ToNext := Zneu;
   ZNeu1^.ToLast := Zneu;
  ZNeu^.Tonext.ToLAst := Nil;
  ZNeu^.ToNext := NIL;
   ZNeu^.ToLast := NIL;
   if ToAnfang = NIL then begin
     ToAnfang := ZNeu;
     ToEnde := ZNeu;
   end
   else begin
     ToEnde^.ToNext:= ZNeu;
     //ToEnde^.ToLast:= ZNeu;
     ZNeu^.ToLast := ToEnde;
     ToEnde:= ZNeu;
   end;
   Anfang.Text:= ToAnfang^.Daten;
   Ende.Text:= ToEnde^.Daten;
   Eingeben.SetFocus;
   Ausgabe();
   Ausgabe2();
end;

procedure TForm1.RemoveClick(Sender: TObject);
begin
  if ToAnfang <> NIL then
  begin
    New(ZAb);
    ZAb:= ToAnfang;
    ToAnfang:= ToAnfang^.ToNext;
     //ToAnfang:= ToAnfang^.ToLast;
    Dispose(Zab);
    Loesche;
    Ausgabe();
    anfang.text:=''; ende.text:='';
    Eingeben.Text:='';
    Eingeben.SetFocus;
  end;
end;



procedure TForm1.LeerenClick(Sender: TObject);
begin
//while NIL <>  ToAnfang    do
  while ToAnfang <> NIL do
  begin
    Lauf:= ToAnfang;
    ToAnfang:= ToAnfang^.ToNext;
    //ToEnde:= ToAnfang^.ToLast;
    Dispose(Lauf);
  end;
  Eingeben.Text:= '';
  Eingeben.SetFocus;
  Loesche;
  Anfang.Text:= '';
  Ende.Text:= '';
end;

procedure TForm1.Button1Click(Sender: TObject);
  var i,c : integer;
begin
  c:=strtoint(beliebig.text);
  new(zac);
  zac:=ToAnfang;
  new(Zad);
  zad:=ToAnfang;
  //if NIL    <>    ToAnfang   then
   if ToAnfang<>NIL then
    begin
      for I:=2 to c do
      begin
      zac:=zac^.ToNext;
    end;
   for I:=3 to c do
   begin
   zad:=zad^.ToNext;
   end;
  zad^.tonext:=zac^.tonext;
  Dispose(Zac);
  Loesche();
  Ausgabe();
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

end.
} end;


Bitte schreibt eine Erklärung neben den Quelltext,da ich lange krank war und das hier von einem Kumpel hat,aber mir das nicht erklären kann.
Thx im Vorraus.
cu mitnick

Moderiert von user profile iconChristian S.: Titel geändert.
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Mo 12.03.07 20:53 
hi,

also eine doppelt verkettete Liste bietet für beide Richtungen Navigation an (im Gegensatz zu einer einfach verketteten List, die nur nach vorn geht).

Ich will hier nicht den Programmablauf kommentieren oder verändern, sondern dir einfach eine kleine Erklärung geben, wie eine solche Liste zustande kommt.

Neben den Daten, die jedes Element Deiner Liste beinhaltet, hat sie ausserdem 2 Zeiger, wobei einer auf das vorherige Element zeigt, der andere auf das nächste. Gibt es einen der beiden nicht, ist die entsprechende Variable NIL.

Das heisst, wenn Du das erste Element erzeugst, sind Zeiger zum vorherigen und nachfolgendem Element IMMER nil (nicht gesetzt). Es ist ja schliesslich das einzigste, welches es gibt in diesem Moment.

Willst Du nun ein Element anfügen, erstellst Du es, und speicherst im Feld zum vorherigen Element den Zeiger auf dein erstes Element. Im ersten wieder rum musst Du den Zeiger auf Dein neues Element im Feld für das nächste Element speichern. Damit hast Du jetzt schon eine Mini-Liste.

Fügst Du ein weiteres an, musst Du im Next-Feld des LETZTEN Elements den Zeiger auf Dein neues Element speichern, im neuen Element auf dein letztes.

Stell Dir das einfach vor wie eine Kette aus dem Mittelalter, die mit den fetten Ringen. Es ist immer ein Ring mit seinem Vorgänger und Nachfolger in der Kette verbunden, und das auf 2 Wegen (wie bei dem Kreis/Ellipse, den Ringe bilden). Da ist einmal der Halbkreis als Deine Verbindung (Zeiger zum Vorgänger) Und der andere Halbkreis als Deine Verbindung (Zeiger) zum nächsten Element.

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw