2016-04-17 23 views
0

Ich versuche, mit verknüpften Listen bis 20 zu zählen. Ich habe den Code geschrieben, mit 2 Funktionen. Eine Funktion, die den Knoten zur verknüpften Liste hinzufügt und eine, die das Ganze ausgibt. aber es ist in einer Endlosschleife und ich habe keine Ahnung warum.Verknüpfte Liste zählt zu 20

Ich habe versucht, mehrere Male zu debuggen und ich glaube, es ist die Funktion hinzufügen, möglicherweise die printlist, während nie auf null und damit seine endlose Drucken wird? Ich denke, die Add-Funktion implementiert die Knoten nicht korrekt, aber ich bin mir nicht sicher, wie ich das beheben soll.

Das ist mein struct:

struct node 
{ 
int number; 
struct node *next; 
}; 
typedef struct node NODE; 

Dies ist hauptsächlich, die Calles die Funktion hinzufügen, und übergibt sie i (0-20) zusammen mit der Liste.

Funktion hinzufügen, die temp als übergebene Daten übernimmt und iter durch die verkettete Liste bis zum Ende iterieren. Als ich mitnehmen, die (& & ITER> Weiter-> Nummer < Nummer) in der while-Schleife druckt es nichts aus, aber mit ihm, es die unendliche Schleife hat

struct node* add(struct node *first, int number){ 
    struct node* temp; 
    struct node* iter; 

    temp= malloc(sizeof(struct node)); 
    temp->number=number; 
    temp->next=NULL; 

    if(first==NULL) 
    return temp; 

    iter=first; 
    while(iter->next!=NULL && iter->next->number < number){ 
    iter=iter->next;} 

    temp->next=iter->next; 
    iter->next=temp; 

    return first; 
} 

Dies ist die drucke Funktion, die ich Ich glaube, das Problem liegt in der Funktion Knoten hinzufügen.

struct node* printList(struct node *mylist){ 

struct node *helpptr; 
helpptr = mylist; 

while (helpptr != NULL){ 
printf("%d", helpptr->number); 
helpptr = helpptr->next; 
         } 
return 0; 
} 

Vielen Dank für Ihre Hilfe im Voraus

+1

ändern Sie den Zustand Ihrer Druckschleife von 'helpptr-> next! = NULL' zu' helpptr! = NULL'. Andernfalls wird die Nummer des letzten Eintrags in der Liste nicht ausgedruckt. Da Funktionsparameter als Wert und nicht als Verweis aufgerufen werden, können Sie mit 'myList' arbeiten, anstatt eine neue Zeigervariable zu erstellen. – jboockmann

+0

Ok, danke!Ich werde das beheben, sobald ich es mehr als nur Drucken 0 – Kris

+0

Sie können NULL zu einem int in Ihrer Hauptfunktion zuweisen. Dies wird eine Kompilierungswarnung ergeben! Siehe unten meine Antwort für eine Lösung ;-) – jboockmann

Antwort

1

Sie aufgerufen undefinierten Verhalten von Wert in Puffer, der über malloc() und nicht initialisiert zugeordnet ist.

Sie sollten mylist in main() mit NULL initialisieren, nicht was von malloc() zurückgegeben wird.

+0

Das hat die Endlosschleife repariert, danke! Aber jetzt, wenn ich es führe, stellt es nur den Kopf der verbundenen Liste zur Verfügung und druckt nur 0 aus, es scheint, dass es nicht den nächsten Knoten richtig hinzufügt. – Kris

+0

@Kris Konnte nicht sowohl in Ihrem [neuen Code] (http://melpon.org/wandbox/permlink/E6MnLqrtxVhG7ho4) und [Code mit Änderung, die ich vorgeschlagen habe] reproduzieren (http://melpon.org/wandbox/permlink/) 1bgdMe3b3Psmox6w). – MikeCAT

0

Ihre Struct-Definition ist in Ordnung, obwohl Sie das Typedef weglassen können, da Sie es später nicht mehr verwenden.

struct node 
{ 
    int number; 
    struct node *next; 
}; 
// typedef struct node NODE; 

Sie haben zwei Fehler im Hauptteil Ihres Programms gemacht. Zuerst müssen Sie - wie bereits von @MikeCAT erwähnt - die mit malloc erstellte Struktur ändern, um undefiniertes Verhalten zu vermeiden. Sie können dies tun, indem Sie myList einfach auf NULL setzen, da Ihre Add-Funktion darauf achten wird. Wenn Sie die Elemente 0-20 hinzufügen, müssen Sie den Zustand Ihrer for-Schleife an i<=size anpassen.

int main(void){ 
    int i, size=20; 
    struct node* mylist = NULL; 
    for(i=0;i=<size;i++){ 
     mylist = add(mylist,i); 
    } 
    printList(mylist); 
    return 0; 
} 

Ihre Add-Funktion ist in Ordnung, hier kann nichts geändert werden.

Die printList-Funktion ist auch in Ordnung. Möglicherweise möchten Sie den Rückgabetyp in void ändern, da diese Funktion bisher keine sinnvollen Informationen liefert. Sie müssen tatsächlich keine neue Zeigervariable helptr erstellen, da Parameter in C als Wert aufgerufen werden. Wenn Sie also den Parameter myList ändern, wird der Wert in der Hauptfunktion nicht geändert.

void printList(struct node *mylist){ 
    while (mylist != NULL){ 
     printf("%d, ", mylist->number); 
     mylist = mylist->next; 
    } 
} 
+0

Hallo Pytheos, vielen Dank für deine Hilfe. Ich habe die von Ihnen vorgeschlagenen Änderungen vorgenommen und erhalte immer noch die gleiche Ausgabe. Hier ist die Bildschirmkappe davon: http://postimg.org/image/bcnaupm4t/ Die Schleife Exit-Anweisung ist nach Main vor printList Anruf – Kris

+0

https://gist.github.com/pythoos/ca86ea759dfd01d63fb3393e7625ed9d Können Sie irgendwelche Unterschiede erkennen zu deiner Version? – jboockmann