2016-07-01 20 views
1

Ich versuche, meine Liste alphabetisch zu sortieren, aber ich habe einige Probleme. Ich habe folgendes:Sortieren verknüpften Liste alphabetisch

struct listNodeData 
     { 
      int value; 
      char *position; 
      char *lastName; 
      struct listNodeData * next; 
     }; 
     typedef struct listNodeData listNodeData; 

void sortList(listNodeData *List) 
{ 
    int swapped; 
    listNodeData *ptr1; 
    listNodeData *lptr = NULL; 

    do 
    { 
     swapped = 0; 
     ptr1 = List->next; 

     while (ptr1->next != lptr) 
     { 
      if (strcmp(ptr1->lastName,ptr1->next->lastName) > 0) 
      { 
       swap(ptr1,ptr1->next); 
       swapped = 1; 
      } 
      ptr1 = ptr1->next; 
     } 
     lptr = ptr1; 
    } 
    while (swapped); 

} 

void swap (listNodeData *a,listNodeData *b) 
{ 

    char *lastName = malloc(sizeof(char) * 20); 
    strcpy(lastName,a->lastName); 
    strcpy(a->lastName,b->lastName); 
    strcpy(b->lastName,lastName); 

} 

Ich versuche, die verknüpfte Liste nach Nachnamen zu sortieren. Im Moment versuche ich nur, die Nachnamen meiner Knoten zu tauschen, bevor ich mir Sorgen mache, den Wert und die Position zusammen mit dem Nachnamen zu tauschen. Wenn ich mein Programm kompiliere, funktioniert es, wenn ich es laufe, bekomme ich Busfehler 10.

Ich bin nicht genau sicher, warum ich Busfehler erhalte. Ich habe es angeschaut und es könnte etwas mit meinem strcmp zu tun haben? Ich bin nicht sicher warum, weil ich lastName, wenn ich meinen Knoten initialisierte, und mallocing innerhalb der Austauschfunktion bin.

Die verknüpfte Liste hat einen Dummy-Kopfknoten, so das ist, warum ich habe ptr1 = List->next statt ptr1 = List

listNodeData *initNode(int number,char *lastName,char *position) 
{ 
    listNodeData *newNode; 
    newNode = malloc(sizeof(listNodeData)); 
    newNode->position = malloc(sizeof(char) * 20); 
    newNode->position = position; 
    newNode->lastName = malloc(sizeof(char) * 20); 
    newNode->lastName = lastName; 
    newNode->value = value; 
    newNode->next = NULL; 
    return (newNode); 
} 
+0

Wie werden Sie die Daten in der verknüpften Liste verwendet initialisiert? –

+0

Ill bearbeite den Beitrag gerade jetzt – FreeStyle4

+0

Nur Randnotiz: Sie brauchen keine Zeile 'typedef struct listNodeData listNodeData;', Sie haben bereits den Typ 'listNodeData' definiert als' struct' über – mvidelgauz

Antwort

1

In Sie Initialisierungscode,

newNode->lastName = malloc(sizeof(char) * 20); 
newNode->lastName = lastName; 

Dies gilt nicht den Puffer verwenden Sie malloc "Ed. Stattdessen ersetzt es den Zeiger auf den Puffer mit dem lastName, der der Funktion gegeben wird. Verwenden Sie ein strcpy die Nachnamen in den Puffer zu bewegen:

strcpy(newNode->lastName, lastName); 

Hinweis: Ebenso gibt mit der position Eigenschaft das gleiche Problem ist so dies für beide getan werden muss.

einige anderen Fragen zu beachten:

  • nicht am Ende des Swap free(lastName) Vergessen Sie nicht, ein Speicherleck in der Swap erzeugen
+0

Völlig vergessen! Ich werde das jetzt versuchen – FreeStyle4

+0

Alles funktioniert jetzt komplett – FreeStyle4

+0

@ FreeStyle4 - da lastName ist nur 20 Zeichen, könnten Sie aus dem Stapel mit _alloca() oder alloca() zuweisen (Name hängt vom Compiler), keine freie() benötigt wird in diesem Fall. Da das Programm nicht rekursiv oder reentrant ist, können Sie lastName nur als statisch (als statisches Array) deklarieren. – rcgldr

0

Es gibt keinen Platz für die Zeichenkette zugeordnet ist in Tauschfunktion.

Versuchen Sie folgendes:

char* lastName = (char*) malloc(20*sizeof(char)); 
+0

Gib * NICHT * die Rückgabe von 'malloc' zurück. Es ist völlig unnötig und kann Fehler verbergen. Siehe: [** Werde ich das Ergebnis von malloc? **] (http://stackoverflow.com/q/605845/995714) für eine gründliche Erklärung. 'char * lastname = malloc (20 * sizeof * lastname);' ist alles was benötigt wird. –

Verwandte Themen