Lag Geschrieben 11. Januar 2007 Geschrieben 11. Januar 2007 Hallo allerseits, ich versuche aus einer Datei eine ungeordnete Liste an Radiosender auszulesen und diese zu sortieren. Ich habe mich dabei an den Programmiervorlagen des Dozenten orintiert, leider bekomme ich die Sortierfunktion noch nicht hin. Diese Sortierfunktion soll die Fälle: Leere Liste, Sender am Anfang / Mitte / Ende einfügen realisieren. Hier die relevanten Codeauszüge: Aufruf aus der Main-Datei while ( !feof(fp) ) { ReadSender(fp, &s); SortiereSenderListe(s, &kopf); printSenderListe(kopf); } Mein Sortierversuch void SortiereSenderListe(struct sender *s, struct sender **kopf) { struct sender *old, *act; act = *kopf; if (*kopf = NULL ) { s->next = NULL; *kopf = s; return; } old = NULL; while(act) { if (act->frequenz < s->frequenz ) { s->next = *kopf; *kopf = s; return; } if ( act->frequenz < s->frequenz ) { while (act->next != NULL) /* letztes Element suchen */ { act = act->next; act->next = s; s->next = NULL; return; } } } } In die while(act) - Schleife scheint er trotz gefüllter Datei gar nicht reinzugehen ( laut Debugger ). Kann mir jemand meinen Fehler sagen? Zitieren
Klotzkopp Geschrieben 11. Januar 2007 Geschrieben 11. Januar 2007 if (*kopf = NULL ) Klassischer Fehler: Das ist eine Zuweisung, kein Vergleich. Wenn du übrigens Code-Tags benutzt, geht die Einrückung deines Codes nicht verloren. Allerdings muss ich sagen, dass deine Einrückung furchtbar ist Zitieren
Lag Geschrieben 12. Januar 2007 Autor Geschrieben 12. Januar 2007 Hmm ok das ist für den ersten Bereich, bei mir geht er jedoch nicht in die act-Schleife, diesen Fehler suche ich noch. Hat da jemand ne Idee? P.S: Bei mir im Compiler ist der Code eingerückt. Edit: Mist ich kann den Starteintrag nicht mehr editieren. Zitieren
Klotzkopp Geschrieben 12. Januar 2007 Geschrieben 12. Januar 2007 Hmm ok das ist für den ersten Bereich, bei mir geht er jedoch nicht in die act-Schleife, diesen Fehler suche ich noch. Hat da jemand ne Idee?Wird SortiereSenderListe denn überhaupt mehrfach aufgerufen? P.S: Bei mir im Compiler ist der Code eingerückt.Ja, aber wie :eek Edit: Mist ich kann den Starteintrag nicht mehr editieren.Ich mach das mal Zitieren
pit030771 Geschrieben 12. Januar 2007 Geschrieben 12. Januar 2007 das hat dir klotzkopf doch erklärt if (xx=bb) { tue was return; } nach der zuweisung in der if anweisung geht er in den block und steigt dann mit der return anweisung aus der funktion aus. er geht in den block nach dem if, weil a=b true ist. dadurch kommt der progfluß gar nicht zu deiner schleife. ein vergleich währe if (a== lg Zitieren
Lag Geschrieben 13. Januar 2007 Autor Geschrieben 13. Januar 2007 Danke. Das hat mir weitergeholfen. Ich bin dadurch nun in der Lage, den neuen Sender sortiert nach Frequenz am Anfang und am Ende einzufügen ( habs in verschiedenen Konstellationen ausgetestet und scheint bugfrei zu arbeiten ). Was mir noch nicht klar ist: Wie muss die Bedingung aussehen, wenn ich ihn in der Mitte eintragen will? Hier mein aktueller Code void SortiereSenderListe(struct sender *s, struct sender **kopf) { struct sender *old, *act; act = *kopf; if (*kopf == NULL ) { s->next = NULL; *kopf = s; printf("Liste leer\n"); return; } old = NULL; while(act) { if (act->frequenz > s->frequenz ) { s->next = *kopf; *kopf = s; return; } if (act->frequenz < s->frequenz ) { while (act->next != NULL) /* letztes Element suchen */ act = act->next; act->next = s; s->next = NULL; return; } } } Zitieren
Klotzkopp Geschrieben 13. Januar 2007 Geschrieben 13. Januar 2007 Ich bin dadurch nun in der Lage, den neuen Sender sortiert nach Frequenz am Anfang und am Ende einzufügen ( habs in verschiedenen Konstellationen ausgetestet und scheint bugfrei zu arbeiten ).Du hast da noch eine Endlosschleife, wenn du zu Beginn zwei Einträge mit derselben Frequenz hinzufügst. Was mir noch nicht klar ist: Wie muss die Bedingung aussehen, wenn ich ihn in der Mitte eintragen will?Das kannst du nicht durch eine einfache Abfrage klären. Du musst dich solange durch die Liste hangeln und immer wieder die Frequenz vergleichen, bis du an der Einfügeposition angekommen bist. Zitieren
pit030771 Geschrieben 13. Januar 2007 Geschrieben 13. Januar 2007 entweder hängst du nen eintrag ans ende, und sortierst neu oder du könntest binär suchen nach der position wo der neu eintrag hin muss. Zitieren
Lag Geschrieben 14. Januar 2007 Autor Geschrieben 14. Januar 2007 Die Idee war, sich durch die Liste zu hangeln, bis die neue Frequenz größer ist als die jeweilige in der Liste. Dann von dem letzten kleineren Eintrag den Pointer auf den einzufügenden Sender zu setzen und von diesem wiederrum auf das nächste zu verweisen. Soweit die Theorie. Das Problem ist nur, dass ich nicht so wirklich weiß, wie das im C++ Code auszusehen hat. Logisch würde ich das so etwa machen. while ( voriger eintrag kleiner als neuer eintrag ) -> gehe Liste durch Wenn entsprechende Stelle gefunden: -> dann Pointer voriges Element auf neues -> Pointer neues Element auf nächstes Nur wie das im C++ Code aussehen muss und wie ich das in den aktuellen Code einfügen muss, versteh ich noch nicht. Zitieren
pit030771 Geschrieben 14. Januar 2007 Geschrieben 14. Januar 2007 sollt ihr da mit diesem pointer eintrag arbeiten? Zitieren
Lag Geschrieben 14. Januar 2007 Autor Geschrieben 14. Januar 2007 void SortiereSenderListe(struct sender *s, struct sender **kopf) { struct sender *old, *act; act = *kopf; } Dies ist vorgegeben, den Rest darf ich frei wählen. Zitieren
pit030771 Geschrieben 15. Januar 2007 Geschrieben 15. Januar 2007 ich meine den " "s->next" eintrag aus der struktur. weil die liste wird dadurch ja nicht wirklich sortiert, sondern in dem jeweiligen eintag der liste ist nur ein zeiger gespeichert der auf den nächst größeren zeigt. müsst ihr das so machen oder koönnt ihr die auch komplett in den speicher laden , also in ein array(vector währe gut, muss aber nicht) und diese dann sortieren? Zitieren
Lag Geschrieben 15. Januar 2007 Autor Geschrieben 15. Januar 2007 Die Lösung sollte duch das umbiegen von Zeigern erfolgen. Ich hab seit gestern abend nun auch eine funktionsfähige Lösung . Danke nochmal für die Hilfe hier im Board. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.