Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Problem mit Listensortierung

Empfohlene Antworten

Veröffentlicht

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?

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.

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

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

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;

	   }



	}



}


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.

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.

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

{

struct sender *old, *act;

act = *kopf;

}

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

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?

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.