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