Einfach verkettete Listen in C sortieren

Ich habe eine verkettete Liste in der Programmiersprache C programmiert. Leider habe ich keine Ahnung, wie man sie sortieren kann. Ich bitte um Hilfe.
Das ist mein Code:

#include
#include
#include
#include

typedef struct LISTELEMENT {
float data;
char name[100];
struct LISTELEMENT *next;
} ListElement;

/************Listen hinzufügen/ausgeben***************/

void insertElement(float wert, char *name, ListElement **ListB, ListElement **ListE) {
ListElement *le, *hilf;
int laenge, i, j=0;

if ((le = (ListElement *) malloc(sizeof(ListElement))) == NULL) {
fprintf(stderr, „Fehler beim Anhaengen!“);
return;
}

/*******Liste ist Leer*********/
if (*ListB==NULL) {
le->data=wert;

laenge=strlen(name);
for (i=0; iname[i]=name[i];
}
le->name[i]=’\0’;

le->next=NULL;

*ListB=le;

//if (le->next == NULL)
*ListE=le;

return;
}

/***Liste mit einem Element***/
if ((*ListB)->next==NULL) {
hilf=*ListB;
le->data=wert;

laenge=strlen(name);
for (i=0; iname[i]=name[i];
}
le->name[i]=’\0’;

if (le->data data) {
hilf->next=NULL;
le->next=hilf;
*ListE=hilf;
*ListB=le;
} else {
le->next=NULL;
(*ListB)->next=le;
*ListE=le;
}
} else { //Mehrere Elemente
le->data=wert;
hilf=*ListB;

laenge=strlen(name);
for (i=0; iname[i]=name[i];
}
le->name[i]=’\0’;

while (hilf!=NULL) {
if (wert data) {
break;
}
j++;
hilf=hilf->next;

}

i=0;
if (hilf==NULL) {
le->next=NULL;
(*ListE)->next=le;
*ListE=le;
} else {
/*********Code für Sortierung***************/
}
}
}

void ausgabe(ListElement *ListB) {
ListElement *le;
int i=1;

le=ListB;
while (le!=NULL) {
printf("%d. Platz: %s hatte eine Zeit von: %.3f Sekunden\n", i, le->name, le->data);
le=le->next;
i++;
}
}

int main(void) {
ListElement *ListB = NULL;
ListElement *ListE = NULL;

insertElement(1.0, „Markus“, &ListB, &ListE);
insertElement(2.0, „Sandra“, &ListB, &ListE);
insertElement(1.5, „Thomas“, &ListB, &ListE);
insertElement(1.6, „Gerhard“, &ListB, &ListE);

ausgabe(ListB);

getch();
return 0;
}

Mach deine Hausübung bitte selbst!

ändere deine Struktur so

typedef struct LISTDATA {
float data;
char name[100];
} ListData;

typedef struct LISTELEMENT {
struct LISTDATA *data;
struct LISTELEMENT *next;
} ListElement;

sinnvollerweise gehen hier nur ausgesuchte Sortieralgorithmen;

so vertauscht Du benachbarte Elemente

ListElement* pElem;

if ( pElem->data->data > pElem->next->data->data )
{
ListData* pData = pElem->next->data;
pElem->next->data = pElem->data;
pElem->data = pData;
}

Achtung: pElem->next darf nicht NULL sein

Entweder programmierst Du den Algorithmus selber (z.B. Quick-Sort, Merge-sort oder ähnliches.
Der Quicksort-Algorithmus (relativ schnell, Aufwand O log N im Gegensatz zu herkömmlichen Algorithmen, häufig gegen O = N^2).
Hier findest Du ein Besipiel für die klassische Insert-Sort Methode
http://perlgeek.de/de/artikel/einfach-verkettete-listen

Ich habe eine verkettete Liste in der Programmiersprache C
programmiert. Leider habe ich keine Ahnung, wie man sie
sortieren kann. Ich bitte um Hilfe.

Ich denke Du solltest Dir auch mal Funktionen wie strcpy (Kopieren eines Strings) anschauen.

Ich habe eine verkettete Liste in der Programmiersprache C
programmiert. Leider habe ich keine Ahnung, wie man sie
sortieren kann. Ich bitte um Hilfe.

Tut mir leid, da kann ich dir auch nicht helfen.

Gruß

Ich habe eine verkettete Liste in der Programmiersprache C
programmiert. Leider habe ich keine Ahnung, wie man sie
sortieren kann. Ich bitte um Hilfe.

Ich antworte mal algorithmisch:

Sofern Du keine der vielen vorgegeben Bibliotheksfuktionen moderner Entwicklungsumgebungen nutzen, sondern was eigenes willst:

Eine Schleife, die jedes Elemt der Liste abgeht. In jedem Durchlauf prüfe, ob das jeweilige Element größer ist als das nachfolgenden. Wenn ja, vertausche sie. Merke Dir, ob Du getauscht hast. Wenn Die Schleife durch ist und Du getauscht hast, setze den Merker zurück und durchlaufe die Schleife erneut.

Wenn Du in einem Durchlauf nicht getauscht hast, ist die Liste sortiert und fertig.

Nennt sich „Bubblesort“ und ist das einfachste (wenn auch nicht effizienteste) Vorgehen. Für kleine Listen absolut ausreichend.

Hope it helps.

Hi,

hilft Dir das?

http://perlgeek.de/de/artikel/einfach-verkettete-listen

VG

Andreas

Hallo Markus,
beim Sortieren muss grundsätzlich der Vergleich und das Tauschen von zwei Objekten möglich sein. „Gute“ Sortieralgorithmen wie z.B. qsort brauchen einen „random“-Zugriff (z.B. Eine Tabelle mit Index). Ein einfach-verkette ist da völlig ungeeignet.
Also Möglichkeit 1:
Liste in Tabelle kopieren, qsort auf der Tabelle, Tabelle in Liste kopieren. Lohnt sich bei sehr vielen Daten, weil dann qsort den Zeitvorteil bringt.
Möglichkeit 2:
einen Sortieralgorithmus verwenden, der nur nebeneinander liegende Objekte vergleicht und vertauscht: „bubble-sort“.
Könnte etwa so ablaufen:

  1. Aktuelles Objekt auf das erste Objekt setzen.
  2. Zeiger auf aktuelles Objekt - und nächstes Objekt
    vergleichen und bei Bedarf vertauschen.
  3. Aktuelles Objekt wird das nächste Objekt
  4. Wenn alle Objekte durchlaufen sind, ist das letzte das (z.B.) größte.
  5. Dann wieder bei 1. beginnen, nur das jeweils letzte nicht mehr ansehen (ist ja bereits sortiert, dadurch werden die Dürchläufe immer kürzer)

Gruß
Rüdiger

Hi markus1064,

Bei einer verketteten Liste bleibt dir nur, über die Liste zu iterieren und
das Element mit dem Folgeelement zu vergleiche.
Dann evtl. Die beiden Zeiger vertauschen.
Achtung vorrangehendes Element beachten.
Dies musst du entsprechend häufig wiederholen,
Nicht nur einmal durchlaufen, sondern entsprechend
der Anzahl deiner Elemente.

Ich hoffe, ich konnte dir damit helfen.
Lg
Bb

Hallo Markus,
C habe ich leider seit über 15 Jahren nicht mehr programmiert. Ich weiß aber noch, dass man für das Sortieren eine eigene Funktion angeben kann, die jeweils für einen Vergleich das Ergebnis >,

Hallo Markus,

sorry für die späte Antwort, aber ich war ein paar Tage offline.

Nun, genau analysiert habe ich Deinen Code nicht. Zum Sortieren kann ich folgende Tipps geben. Sortieren geht mit 2 Grundfunktionen: Vergleichen und Umhängen.

Minimalbeispiel: Liste soll alphabetisch nach Name sortiert werden. Vergleichsfunktion testet ob Name1 kleiner als / größer als (das ist Dein Sortierkriterium) Name2 ist. Falls ja, tauschen Name1 und Name2 den Platz in der Liste.

Der Artkel http://de.wikipedia.org/wiki/Bubblesort illustriert das Sortieren.

Viel Erfolg !

Gerhard

Hallo,
ich weiss nicht, ob die Frage noch akut ist, aber google mal nach „bubble sort mit c“. Das wäre das, was mir jetzt so auf die Schnelle einfällt…

Gruß
Michael