Ich habe folgende Datenstruktur:Selection Art mit verketteten Liste der
struct scoreentry_node {
struct scoreentry_node *next;
int score;
char name[1];
};
typedef struct scoreentry_node *score_entry;
Ich versuche, eine Funktion zu erstellen, die meine Struktur, um verbraucht und ordnet sie um aufsteigend auf den Namen basiert. Ich möchte die Eingabe ändern, ohne Speicher-Zuweisung oder Befreiung nichts:
ich Ihre Vorschläge versucht haben:
void selectionsort(score_entry *a) {
for (; *a != NULL; *a = (*a)->next) {
score_entry *minafteri = a;
// find position of minimal element
for (score_entry j = (*a)->next; j != NULL; j = j->next) {
if (strcmp(j->name, (*minafteri)->name) == -1) {
*minafteri = j;
}
}
// swap minimal element to front
score_entry tmp = *a;
a = minafteri;
*minafteri = tmp;
}
}
Ich teste den obigen Code mit den folgenden:
score_entry x = add(8, "bob", (add(8 , "jill", (add (2, "alfred", NULL)))));
iprint("",x);
selectionsort(&x);
iprint("", x);
clear(x); //Frees the whole list
iprint()
druckt die Score- und Namensfelder in der Struktur. Meine Add-Funktion ist wie folgt:
score_entry add(int in, char *n, score_entry en) {
score_entry r = malloc(sizeof(struct scoreentry_node) + strlen(n));
r->score = in;
strcpy(r->name, n);
r->next = en;
return r;
}
Ich erhalte Haufen Fehler und meinen zweiten Druck ist die sortierte Liste nicht drucken, ist es nichts druckt. Was mache ich falsch, und was kann ich tun, um es zu beheben?
Selection Art ist eine schlechte Sortieralgorithmus für einfach verkettete Listen (oder Listen im Allgemeinen, für diese Angelegenheit). Wenn Sie nach einem Sortieralgorithmus suchen, der in der Laufzeit optimal ist und keinen Speicher zuweist, versuchen Sie Mergesort. – Philip
'Char Name [1];' ist ein bisschen klein. Damit die Zeichenfolge null-terminiert wird, wäre die einzige gültige Zeichenfolge "", was den Vergleich der Namen eher nutzlos machen würde. – wildplasser
@Philip für merge sort brauche ich nicht zwei Listen? Ich habe nur einen .. – Thatdude1