Veröffentlicht 11. Januar 200718 j 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?
11. Januar 200718 j 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
12. Januar 200718 j 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.
12. Januar 200718 j 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
12. Januar 200718 j 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
13. Januar 200718 j 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; } } }
13. Januar 200718 j 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.
13. Januar 200718 j 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.
14. Januar 200718 j 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.
14. Januar 200718 j void SortiereSenderListe(struct sender *s, struct sender **kopf) { struct sender *old, *act; act = *kopf; } Dies ist vorgegeben, den Rest darf ich frei wählen.
15. Januar 200718 j 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?
15. Januar 200718 j 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.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.