Einzelnen Beitrag anzeigen

legionen

Registriert seit: 3. Sep 2007
23 Beiträge
 
#10

Re: Probleme mit Listen/ verkettet Listen

  Alt 25. Okt 2007, 13:39
OKAY, dass mit dem Zeigern habe ich jetzt verstanden aber leider bin ich anscheint zu blöd folgendes Problem weitergehend zu lösen:

ich probiere das Problem wieder etwas zu verallgemeinern, aber ich hoffe das es so klappt...

Also ich habe natürlich eine etwas größere Liste, die nicht nur einfach mit einer fortlaufenden zahl gefühlt ist, sondern es werden nach einer bestimmten Rechnung Werte zwischen 0 und 100 eingetragen.... wenn zwei aufeinanderfolgende Werte ähnlich sind, so sollen diese zusammengezogen werden und dann die Liste wieder von Vorne durchlaufen..... solange bis kein aufeinanderfolgendes Wertepaar mehr zusammengezogen wurde..... soweit zur Theorie.... leider macht mir die Umsetzung Probleme.... ich mache mal kurz folgendes Beispiel:

A (1,1) -> B (3,2) -> C (3,3) -> D (3,1) -> E (20

Also wie soll das Programm durchlaufen....

Im ersten Schritt sollen B und C zusammenkommen und die Liste weiter durchlaufen...

A (1,1) -> B (3,25) -> D (3,1) -> E (20)

im zweiten Schritt sollen B und D zusammenkommen

A (1,1) -> B (3,175) -> E (20)

im dritten Schritt soll nichts mehr gemacht werden und die Prozedure abbrechen.....

So mein Quellcode:

ZUR Erklärung:

Die beiden Boolean Files Durchlauf und gefunden, dienen einfach als Kriterium ob die While Do Schleifen weiter müssen
- Durchlauf steht dafür, dass wenn bei einem Durchlauf kein Element zusammengeführt wurde die While Do Procedure abgebrochen werden soll
- gefunden gibt zurück wenn innerhalb der zweiten While Do Schleife zwei Elemente zusammengelegt wurden und deshalb von vorne alles nochmal durchsucht werden soll.

die Große IF Then Anweisung bildet von beiden Werten den Mittelwert und guckt ob die beiden Werte jeweils in einem Streubereich enthalten sind.... habe diese IF THEN Anweisung stark zusammengefasst, damit sie keine so großen Probleme darstellt....



Delphi-Quellcode:
 While Durchlauf Do
   Begin
     Element := Dummy; // Bei jedem Start des Durchlaufs soll wieder auf von vorne gesucht werden
     Durchlauf := False; // wenn nichts gefunden wird, soll die Schleife abgebrochen werden
     gefunden := false; // da die schleife wieder von vorne anfängt, soll erstmal die zweite while do schleife laufen
     While (Element^.nd<> NIL) and (Gefunden = false) do // wenn er ende erreicht soll abgebrochen werden
       Begin
         Element:= Element^.nd; // immer ein Element weiter
         gefunden := true; // hier schonmal auf true setzen
         // in der IF Then Anweisung werden die Werte des aktuellen mit dem nächsten vergleicht.. jeweils 20% kleiner/ größer
         // dürfen die Einzelwerte sein, damit die beiden Elemente zusammengelegt werden
         If (Element.Nummer [1] < (((Element.Nummer [1]+Element^.Nummer [1]) / 2) * 1.2)) and
            (Element.Nummer [1] > (((Element.Nummer [1]+Element^.Nummer [1]) / 2) * 0.8)) and
            (Element^.Nummer [1] < (((Element.Nummer [1]+Element^.Nummer [1]) / 2) * 1.2)) and
            (Element^.Nummer [1] > (((Element.Nummer [1]+Element^.Nummer [1]) / 2) * 0.8)) Then
           Begin
             // Sind die beiden Elemente in dem Bereich, dann soll der erste als Wert den Mittelwert beider bekommen
             Element.Nummer := (Element.Nummer [1]+Element^.Nummer [1]) / 2;
             // hier soll dann der Zeiger übergeben werden wenn ich die IF anweisung drinnen halte, dann ist es eine endlosschleife
             // wenn ich sie rausnehme, kommt es zu einem Fehler
             IF Element^.nd^.nd<> NIL Then
               Element^.nd:= Element^.nd^.nd;
             Durchlauf := true;
           End
           Else gefunden := false; //soll weiter suchen, bis die andere While anforderung erfühlt ist.....
       End;
   End;
Ich weiß, dass ich hier sicherlich einiges abverlange, aber ich drehe noch durch..... ist für meine Diplomarbeit und leider kommen ständig probleme, die man durch solche Lösungen ab zuschwächen probiert....

Ich freue mich schon auf eure Lösung
  Mit Zitat antworten Zitat