Zum Inhalt springen

Problem mit Listensortierung


Empfohlene Beiträge

Geschrieben

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?

Geschrieben
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 ;)

Geschrieben

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.

Geschrieben
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 ;)
Geschrieben

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==B)

lg

Geschrieben

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;

	   }



	}



}


Geschrieben
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.
Geschrieben

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.

Geschrieben

void SortiereSenderListe(struct sender *s, struct sender **kopf)

{

struct sender *old, *act;

act = *kopf;

}

Dies ist vorgegeben, den Rest darf ich frei wählen.

Geschrieben

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?

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...