2016-06-12 4 views
0

Ich schrieb eine verknüpfte Liste und schaffte es, filesupport hinzuzufügen. Jetzt gibt es ein Problem mit der Eingabeaufforderung. Die letzte pokemon->name und pokemon->number wird kryptisch ausgegeben. Irgendwie nehme ich an, dass ich einen Fehler beim Speichern des letzten Stapels von Daten im Speicher gemacht habe, weil er tatsächlich korrekt in der Datei gespeichert ist.Ausdruck der Eingabe einer verketteten Liste [C]

Hier ist der Code (Eingangsprüfung nach dem Code)

pokemonPtr addPokemon(void){ 

FILE *filePtr; 

//filePtr = fopen ("pokedex.txt", "a"); 

//if (filePtr == NULL){ 
    filePtr = fopen ("pokedex.txt","w"); 
//} 

pokemonPtr firstPtr; 
pokemonPtr thisPokemon; 
firstPtr = NULL; 

firstPtr = (pokemon *) malloc(sizeof(pokemon)); 
firstPtr->name = (char *) malloc(sizeof(char) * POKEMON_LENGTH); 

printf ("Enter the name of the Pokemon.\n"); 
scanf("%s",firstPtr->name); 
fprintf(filePtr, "Pokemon Name:%s ", firstPtr->name); 
getchar(); 
printf ("Enter the number of the Pokemon.\n"); 
scanf("%d",&firstPtr->number); 
fprintf(filePtr, "Pokemon Nummer:%d\n", firstPtr->number); 



firstPtr->next = (pokemon *) malloc(sizeof(pokemon)); 

thisPokemon = firstPtr->next; 

int i = 0; 

while (i < 2){ 

    thisPokemon->name = (char *) malloc(sizeof(char) * POKEMON_LENGTH); 

    printf ("Enter the name of the Pokemon.\n"); 
    scanf("%s",thisPokemon->name); 
    fprintf(filePtr, "Pokemon Name:%s ", thisPokemon->name); 
    printf ("Enter the number of the Pokemon.\n"); 
    scanf("%d",&thisPokemon->number); 
    fprintf(filePtr, "Pokemon Nummer:%d\n", thisPokemon->number); 

    thisPokemon->next =(pokemon *) malloc (sizeof(pokemon)); 
    thisPokemon = thisPokemon->next; 

    i++; 

} 

thisPokemon->next = NULL; 

fclose (filePtr); 

return firstPtr; 

} 

void showPokemon(pokemonPtr firstPtr){ 

printf ("Name: %s\n" 
     "Nummer: %d\n", firstPtr->name, firstPtr->number); 

pokemonPtr thisPokemon = firstPtr->next; 

while (thisPokemon != NULL){ 

    printf ("Name: %s\n" 
      "Nummer: %d\n", thisPokemon->name, thisPokemon->number); 

    thisPokemon = thisPokemon->next; 
} 


} 

Der Eingang I versucht war:

Pokemon Name: dudu Pokemon Nummer: 3
Pokemon Name: dada Pokemon Nummer 3
Pokemon Name:: dudi Pokemon Nummer: 23
Die Ausgabe in cmd war:
Name: dudu
Nummer: 3
Name: dada
Nummer: 3
Name: dudi
Nummer: 23
Name: Ot
Nummer: 7607776

Was ist hier passiert?

+0

oh sry, ich werde die fehlende Funktion hinzufügen –

Antwort

0

Die letzte pokemon->name und pokemon->number wird immer ausgegeben kryptischen

Grund:

Der Grund warum bekommt man ein 4 th Knoten ist, weil Sie einen leeren Knoten am Ende jeder Iteration erstellen und es dann bis zu Beginn jeder Iteration ... Füllung

  • Während der letzten Iteration erstellen Sie einen leeren Knoten und verlassen die Schleife.
  • dem next Mitglied dieses leeren Knotens zuweisen Sie die NULL.
  • Daher erhalten Sie vier Knoten gedruckt, in denen der letzte leer ist.

Lösung:

Die Lösung dieses Problem Speicher am Anfang als die andere Antwort suggests.But,

In Ihrem Code zugewiesen ist, Du nimmst den Schmerz, alles separat für den Kopfknoten und den Rest der Knoten in beiden Funktionen zu schreiben

Sie können erreichen, was Sie tun möchten, indem Sie eine einzelne Schleife verwenden ...

hier habe ich eine Funktion zur Verfügung gestellt, in dem Sie in einer einzigen Schleife tun, dass:

pokemonPtr addPokemon(void){ 

FILE *filePtr; 

filePtr = fopen ("pokedex.txt","w"); 

pokemonPtr firstPtr; 
pokemonPtr thisPokemon; 

int i; 

for(i = 0 ; i < 3 ; i++) //single loop! 
{ 
    if(i==0)//head node 
    { 
     thisPokemon =(pokemon *) malloc (sizeof(pokemon)); 
     firstPtr=thisPokemon; 
    } 
    else //any other node 
    { 
     thisPokemon->next =(pokemon *) malloc (sizeof(pokemon)); 
     thisPokemon=thisPokemon->next; 
    } 

    //first allocation of memory takes place 
    thisPokemon->name = (char *) malloc(sizeof(char) * POKEMON_LENGTH); 

    //then you enter details 
    printf ("Enter the name of the Pokemon.\n"); 
    scanf("%s",thisPokemon->name); 
    fprintf(filePtr, "Pokemon Name:%s ", thisPokemon->name); 
    printf ("Enter the number of the Pokemon.\n"); 
    scanf("%d",&thisPokemon->number); 
    fprintf(filePtr, "Pokemon Nummer:%d\n", thisPokemon->number); 

    //no memory allocated at the end 
} 

thisPokemon->next=NULL; // the next of last entered node points NULL 

fclose (filePtr); 

return firstPtr; 

} 

Abgesehen davon ähnlich, ich würde vorschlagen gerne Sie verwenden, um den showPokemon() Funktion auf diese Weise:

void showPokemon(pokemonPtr firstPtr){ 

pokemonPtr thisPokemon = firstPtr; 

while (thisPokemon != NULL) 
{ 

    printf ("Name: %s\n" 
      "Nummer: %d\n", thisPokemon->name, thisPokemon->number); 

    thisPokemon = thisPokemon->next; 
} 


} 

Sie brauchen nicht für den ersten Knoten und Rest der Knoten separat drucken :)

+0

Dies ist eine sehr klare Erklärung, vielen Dank! Ich werde mir Zeit nehmen und durcharbeiten! –

1

Ok, ist das Problem in der Art und Weise Sie Ihre verknüpften Liste erstellen - es so bald trivial ist, wie Sie den Code unter einem Debugger ausführen -> Sie sollten wirklich lernen zu tun, dass ;-)

Sie sparen richtig der Kopf in firstPtr, aber Sie starten Sie Schleife mit einem leeren, aber bereits erstellt und Link-Element.Also hier ist das, was in addPokemon passiert:

  • Anfangsteil: alloc ein neues Element und liest ihre Werte ein neues Objekt zuweisen und den Link zum ersten: ersten (Dudu) -> diese (leer)
  • ersten Durchgang in Loop: ersten (Dudu) -> dada -> leer
  • zweiten Durchlauf in Schleife: erste (Dudu) -> dada -> dudi -> leer
  • nach dem Ende der Schleife, sie einen null gestellt, aber ein Schritt zu weit: zuerst (dudu) -> dada-> dudi -> leer -> NULL

Wie beheben:

Sie sollten ein neues Element in der Schleife, kurz bevor Werte darin zu speichern und starten Sie die Schleife mit thisPokemon zeigt auf firstPokemon zuteilen:

... 
firstPtr->next = NULL; 

thisPokemon = firstPtr; 

int i = 0; 

while (i < 2){ 

    thisPokemon->next =(pokemon *) malloc (sizeof(pokemon)); 
    thisPokemon = thisPokemon->next; 
    thisPokemon->name = (char *) malloc(sizeof(char) * POKEMON_LENGTH); 

    printf ("Enter the name of the Pokemon.\n"); 
    scanf("%s",thisPokemon->name); 
    fprintf(filePtr, "Pokemon Name:%s ", thisPokemon->name); 
    printf ("Enter the number of the Pokemon.\n"); 
    scanf("%d",&thisPokemon->number); 
    fprintf(filePtr, "Pokemon Nummer:%d\n", thisPokemon->number); 

    i++; 

} 
... 
+0

gute Erklärung Herr. Aber, ich denke, es ist ratsam, zu OP zu sagen, die gleiche Schleife für den Betrieb auf allen Knoten zu verwenden, anstatt auf Kopfknoten und Rest der Knoten getrennt zu arbeiten :) – Cherubim

+0

vielen Dank, das ist eine wirklich nette Erklärung. Ich wünschte ich könnte dich aufrütteln! –