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



BeitragVerfasst: Mo 28.04.08 11:35 
Hallo Zusammen,

Hoffe, das hier ist die richtige Rubrik und das mir überhaupt geholfen werden kann.
Mein Problem ist, fürchte ich, recht kompliziert oder zumindest umfangreich, aber vielleicht hab ich ja Glück und es ist ganz offensichtlich.

Das Projekt sieht folgendermaßen aus: Ich habe einen Binärbaum, die Objekte bestehen aus einem Record mit mehreren Eigenschaften, darunter ID, Name, Geburtsdatum, usw. Der Baum ist nach der Eigenschaft "ID" sortiert. In einer ListBox wird der Baum als Liste der ID ausgegeben, in einer anderen als Liste der Namen. In einer dritten ListBox sollen die anderen Eigenschaften der Objekte ausgegeben werden, wenn man in der 1. ListBox auf die ID klickt.
Soweit sogut. An sich funktioniert das auch, allerdings nur, wenn ich die IDs von Richtung Blatt zu Wurzel durchklicke. In der anderen Richtung gibt er nur Mist aus.

Das hier wären die Prozeduren:

Das ist die ListBox, in der man die IDs anklickt

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TF_Main.LB_LIDClick(Sender: TObject);
var Gesucht, Details: Zeigertyp;
begin
New(Gesucht);
New(Details);
LB_Details.Clear;
Gesucht^.ID := StrToInt(LB_LID.Items[LB_LID.ItemIndex]);
LB_LName.ItemIndex:=LB_LID.ItemIndex;
Suchen(Wurzel, Gesucht, Details);
LB_Details.Items.Add('Geburtsdatum: ' + DateToStr(Details^.Geb));
LB_Details.Items.Add('Zwinger: ' + Details^.Zwinger);
LB_Details.Items.Add('Rasse: ' + Details^.Rasse);
LB_Details.Items.Add('Farbe: ' + Details^.Farbe);
If Details^.Gender = False
then LB_Details.Items.Add('Geschlecht: Männlich')
else LB_Details.Items.Add('Geschlecht: Weiblich');
Dispose(Gesucht);
Dispose(Details);
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TF_Main.Suchen(var Sucher, Gesucht, Details: Zeigertyp);
begin
  If Sucher <> NIL
  then begin
       If Sucher^.ID = Gesucht^.ID
       then begin
            Details := Sucher;
            Sucher := NIL;
            end
       else begin
            Suchen(Sucher^.links, Gesucht, Details);
            Suchen(Sucher^.rechts, Gesucht, Details);
            end;
       end;
end;
Fiete
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 617
Erhaltene Danke: 364

W7
Delphi 6 pro
BeitragVerfasst: Mi 30.04.08 15:05 
Moin Hundezahn,
vielleicht hilft dies (Turbopascal 4 Anno 1988)

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:
PROGRAM BAUMDEMONSTRATION;
 USES CRT;
 CONST MAX=3;
 TYPE BAUMINHALT=STRING[MAX];
      BAUMZEIGER=^KNOTEN;
      KNOTEN=RECORD
              INHALT:BAUMINHALT;
              LINKS,RECHTS:BAUMZEIGER
             END;
 VAR BAUM,SBAUM:BAUMZEIGER;
     EINGABE:BAUMINHALT;
     AUSWAHL:CHAR;
     FELD:BYTE;

 PROCEDURE EINFUEGEN(VAR SUCHBAUM:BAUMZEIGER;NEUINHALT:BAUMINHALT);
  BEGIN
   IF SUCHBAUM=NIL THEN
    BEGIN
     NEW(SUCHBAUM);
     WITH SUCHBAUM^ DO BEGIN INHALT:=NEUINHALT;LINKS:=NIL;RECHTS:=NIL END
    END
   ELSE IF NEUINHALT<SUCHBAUM^.INHALT THEN EINFUEGEN(SUCHBAUM^.LINKS,NEUINHALT)
        ELSE IF SUCHBAUM^.INHALT<NEUINHALT THEN EINFUEGEN(SUCHBAUM^.RECHTS,NEUINHALT)
             (* ELSE NEUINHALT IST SCHON VORHANDEN *)
  END;

 PROCEDURE SUCHEN(SUCHBAUM:BAUMZEIGER;VAR GEFUNDEN:BAUMZEIGER;VAR SUCHINHALT:BAUMINHALT);
  VAR ERFOLG:BOOLEAN;
  BEGIN
   ERFOLG:=FALSE;GEFUNDEN:=SUCHBAUM;
   WHILE (GEFUNDEN<>NILAND NOT ERFOLG DO
    WITH GEFUNDEN^ DO
     IF SUCHINHALT<INHALT THEN GEFUNDEN:=LINKS
     ELSE IF INHALT<SUCHINHALT THEN GEFUNDEN:=RECHTS
          ELSE BEGIN ERFOLG:=TRUE;SUCHINHALT:=INHALT END;
   IF NOT ERFOLG THEN
    BEGIN
     GOTOXY(1,18);WRITE(SUCHINHALT,' NICHT GEFUNDEN!');DELAY(1000)
    END
  END;

 PROCEDURE LOESCHEN(VAR SUCHBAUM:BAUMZEIGER;LOESCHINHALT:BAUMINHALT);
  VAR LOESCHZEIGER:BAUMZEIGER;(* DIESER EINTRAG WIRD GELOESCHT *)

  PROCEDURE ERSETZE(VAR GROESSTER:BAUMZEIGER);
   BEGIN
    IF GROESSTER^.RECHTS<>NIL THEN ERSETZE(GROESSTER^.RECHTS)
    ELSE BEGIN
          LOESCHZEIGER^.INHALT:=GROESSTER^.INHALT;LOESCHZEIGER:=GROESSTER;
          GROESSTER:=GROESSTER^.LINKS
         END
   END;

  BEGIN(* LOESCHEN *)
   IF SUCHBAUM<>NIL THEN
   IF LOESCHINHALT<SUCHBAUM^.INHALT THEN LOESCHEN(SUCHBAUM^.LINKS,LOESCHINHALT)
   ELSE IF SUCHBAUM^.INHALT<LOESCHINHALT THEN LOESCHEN(SUCHBAUM^.RECHTS,LOESCHINHALT)
        ELSE
         BEGIN
          LOESCHZEIGER:=SUCHBAUM;
          IF LOESCHZEIGER^.LINKS=NIL THEN SUCHBAUM:=LOESCHZEIGER^.RECHTS
          ELSE IF LOESCHZEIGER^.RECHTS=NIL THEN SUCHBAUM:=LOESCHZEIGER^.LINKS
               ELSE ERSETZE(LOESCHZEIGER^.LINKS);
          DISPOSE(LOESCHZEIGER)
         END
  END;

 PROCEDURE LINIE(VON,BIS,ZEILE:INTEGER);
  VAR I:INTEGER;
  BEGIN
   IF VON<BIS THEN FOR I:=VON TO BIS DO BEGIN GOTOXY(I,ZEILE);WRITE('-'END
   ELSE FOR I:=VON DOWNTO BIS DO BEGIN GOTOXY(I,ZEILE);WRITE('-'END;
   GOTOXY(BIS,ZEILE+1);WRITE('I')
  END;

 PROCEDURE KOPF;
  BEGIN
   CLRSCR;
   WRITELN('Demonstration einer Baumstruktur':56);
   WRITELN('--------------------------------':56)
  END;

 PROCEDURE SCHREIBBAUM(B:BAUMZEIGER;X,Y,BREITE:INTEGER);
  VAR H:BYTE;
  BEGIN
   IF B<>NIL THEN
    BEGIN
     IF B^.LINKS<>NIL THEN BEGIN
                            LINIE(X-FELD+1,X-BREITE DIV 2,Y);
                            SCHREIBBAUM(B^.LINKS,X-BREITE DIV 2,Y+2,BREITE DIV 2)
                           END;
     GOTOXY(X-FELD DIV 2,Y);WRITE(COPY(B^.INHALT,1,FELD));
     IF B^.RECHTS<>NIL THEN BEGIN
                             H:=0;IF FELD=1 THEN H:=1;
                             LINIE(X+FELD-1+H,X+BREITE DIV 2,Y);
                             SCHREIBBAUM(B^.RECHTS,X+BREITE DIV 2,Y+2,BREITE DIV 2)
                            END
    END
  END;

// drei rekursive Prozeduren
// der Zeitpunkt der Ausgabe ist jedesmal ein anderer

 PROCEDURE PREORDER(B:BAUMZEIGER);
  BEGIN
   IF B<>NIL THEN
    BEGIN
     WRITE(B^.INHALT:FELD+1);PREORDER(B^.LINKS);PREORDER(B^.RECHTS)
    END
  END;

 PROCEDURE INORDER(B:BAUMZEIGER);
  BEGIN
   IF B<>NIL THEN
    BEGIN
     INORDER(B^.LINKS);WRITE(B^.INHALT:FELD+1);INORDER(B^.RECHTS)
    END
  END;

 PROCEDURE POSTORDER(B:BAUMZEIGER);
  BEGIN
   IF B<>NIL THEN
    BEGIN
     POSTORDER(B^.LINKS);POSTORDER(B^.RECHTS);WRITE(B^.INHALT:FELD+1)
    END
  END;

 BEGIN(* OF MAIN *)
  CLRSCR;
  REPEAT
   WRITE('MAXIMALE EINGABELAENGE (1-',MAX:1,') ? ');READLN(FELD)
  UNTIL FELD IN[1..MAX];
  KOPF;BAUM:=NIL;
  REPEAT
   GOTOXY(1,23);CLREOL;GOTOXY(1,23);
   WRITE('(E)infuegen   (L)oeschen   (S)uchen   (Q)uit : ');CLREOL;
   REPEAT
    AUSWAHL:=UPCASE(READKEY)
   UNTIL AUSWAHL IN['E','L','S','Q'];WRITELN(AUSWAHL);
   IF AUSWAHL<>'Q' THEN
    BEGIN
     REPEAT
      GOTOXY(1,24);CLREOL;GOTOXY(1,24);
      WRITE('Dein Begriff : ');READ(EINGABE)
     UNTIL LENGTH(EINGABE)>0;
     EINGABE:=COPY(EINGABE,1,FELD);
     CASE AUSWAHL OF
      'E'BEGIN EINFUEGEN(BAUM,EINGABE);KOPF;SCHREIBBAUM(BAUM,40,5,40END;
      'L'BEGIN  LOESCHEN(BAUM,EINGABE);KOPF;SCHREIBBAUM(BAUM,40,5,40END;
      'S'BEGIN
            SUCHEN(BAUM,SBAUM,EINGABE);KOPF;
            IF SBAUM<>NIL THEN SCHREIBBAUM(SBAUM,40,5,40)
           END
     END;
     GOTOXY(20,24);WRITE('Weiter mit <RETURN>');READ;GOTOXY(1,24);CLREOL;
     SCHREIBBAUM(BAUM,40,5,40);
     GOTOXY(1,16);WRITE('Preorder  :');PREORDER(BAUM);
     GOTOXY(1,18);WRITE('Inorder   :');INORDER(BAUM);
     GOTOXY(1,20);WRITE('Postorder :');POSTORDER(BAUM)
    END
  UNTIL AUSWAHL='Q'
 END.

Gruß
Fiete

_________________
Fietes Gesetz: use your brain (THINK)