2017-07-24 4 views
1

Hilf mir, ich bin nur ein Neuling.Verknüpfte Liste in C, Namen überschreiben

Ich studiere und übe derzeit eine verkettete Liste in C. Ich möchte die Namen der Instrumente nach ihren Größen ordnen.

Problem ist, jedes Mal, wenn ich ein neues Instrument erstelle, werden die Namen der vorherigen Instrumente von meinem neu erstellten Instrument überschrieben, aber die Größen werden nicht überschrieben.

Warum und was passiert dort?

zum Beispiel, das erste Instrument ist "FLUTE" und Größe ist 1, es wird diese Informationen anzeigen. Aber wenn die 2. Schleife kommt und ich das zweite Instrument ex. Eingib, ist der Name "TRUMPET" und die Größe ist 3, "FLUTE" weg ..! Es wird angezeigt

Name: TROMPET, Größe: 1 // aber die Größe ist immer noch da.

Name: trompete, Größe: 3

//here's my main 
int main(void) 
{ 
    int add = 1; 
    int size; 
    char name[30]; 
    instrument *start = NULL; 
    instrument *x = NULL; 
    instrument *y = NULL; 
    instrument *next = NULL; 

    while(add != 0) 
    { 
     printf("Enter the name of the instrument: "); 
     scanf(" %29s", name); 

     printf("Size: "); 
     scanf(" %d", &size); 

     next = pos(name, size); 

     if(start == NULL) 
     { 
      start = next; 
     } 

     if(x != NULL) 
     { 
      x->next = next; 
     } 

     x = next; 
     //for now, I'll just display the instruments instead of sorting them. 
     displayInstruments(start); 

     printf("\nDo you want to add more?: "); 
     scanf(" %d", &add); 
    } 

    freeInstruments(start); 

    return 0; 
} 

//this is my instrument creator function 
instrument* pos(char *name, int size) 
{ 
    instrument *i = malloc(sizeof(instrument)); 
    i->name = name; 
    i->size = size; 
    i->next = NULL; 

    return i; 
} 

//and other codes below here that don't matter for now. . . . . . . . 
. 
. 
. 
. 
+0

call 'pos (strdup (name), size)' dies wird eine Kopie des Namens – pm100

+0

Vielen Dank. Jetzt hab ich es verstanden. Also muss ich zuerst den Namen kopieren, da alle auf die gleiche Adresse zeigen. Tnx. Aber über den Raum, den die Funktion "strdup()" geschaffen hat, wohin wird es gehen? Stapel oder auf dem Haufen? – Bicolano

+1

Haufen - und Sie müssen es befreien (es gibt keine kostenlosen Mittagessen in C Land) – pm100

Antwort

1

Sie verwenden einen einzelnen Puffer, um die name jedes Instruments zu speichern. Standardmäßig wird int s kopiert, so dass Sie die Größe jedes Instruments korrekt speichern. Bei Strings speichern Sie jedoch einen Zeiger, der den Speicherort von string enthält. Alle Ihre instrument->name Zeiger zeigen auf denselben Speicherort, so dass alle den zuletzt hinzugefügten Gerätenamen anzeigen.

Um dies zu beheben, ändern Sie i->name = name zu i->name = strdup(name), die die Zeichenfolge duplizieren und eine eigene persönliche Kopie erstellen.

+0

Vielen Dank. Jetzt hab ich es verstanden. Also muss ich zuerst den Namen kopieren, da alle auf die gleiche Adresse zeigen. Tnx. Aber über den Raum, den die Funktion "strdup()" geschaffen hat, wohin wird es gehen? Stapel oder auf dem Haufen? – Bicolano

+0

Es wird auf dem Heap zugewiesen. – Tim510

+0

tnx ... Es bedeutet, dass ich diese Namen richtig machen muss? – Bicolano

2

Sie schaffen Raum für jeden instrument, sondern verwenden den gleichen Raum (die globale Variable name) für jeden ihrer Namen.