2015-12-15 5 views
1

Je dois travailler sur des listes chaînées et obtenir une erreur d'accès avant même que quelque chose ne se passe dans ma main. Je ne sais pas ce qui ne va pas. Je suis relativement nouveau dans la gestion de la mémoire dynamique. Ce serait bien si quelqu'un pouvait jeter un coup d'œil sur les fonctions. La déclaration a été donnée par le professeur, nous devons donc retourner un DoubleNote *. Mon code est ci-dessous:C: Liste liée mauvais accès de la mémoire

#include <stdio.h> 
#include <stdlib.h> 

typedef struct node{ 

    double var; 

    struct node *next; 


} DoubleNode; 


DoubleNode* insertFirst(DoubleNode* head, double d){ 

    DoubleNode* new_head; 
    new_head = (DoubleNode*)malloc(sizeof(DoubleNode)); 

    if (new_head == NULL) { 
     printf("Error: Allocating memory for new node failed!"); 
     exit(1); 
    } 

    new_head->var = d; 

    new_head->next = head; 

    head = new_head; 


    return head; 

} 



DoubleNode* inserLast(DoubleNode* head, double d){ 

    DoubleNode* current = head; 

    while (current != NULL) { 
     current = current->next; 
    } 

    current->next = (DoubleNode*)malloc(sizeof(DoubleNode)); 
    if (current->next == NULL) { 
     printf("Error: Allocating memory for new node failed!"); 
     exit(1); 
    } 
    current->next->var = d; 
    current->next->next = NULL; 

    return head; 

} 

DoubleNode* inverseDoubleListCon(DoubleNode* head){ 

    DoubleNode* current = head; // iteration variable starts on head of old list 
    DoubleNode* conHead = current; // Head of the new list 

    while (current != NULL) { 

     current = current->next; //iteration step 

     DoubleNode* newConHead = (DoubleNode*)malloc(sizeof(DoubleNode)); //allocating memory for new head 

     if (newConHead == NULL) { 
      printf("Error: Allocating memory for new node failed!"); 
      exit(1); 
     } 

     newConHead = current; // new_head is the next variable in the old list 

     newConHead->next = conHead; //new head points to old head of the new list 

     conHead = newConHead; // new head is set 
    } 


    return conHead; 

} 

void printList(DoubleNode* head){ 

    DoubleNode* current = head; 

    while (current != NULL) { 
     printf("%lf\n", current->var); 
     current = current->next; 
    } 

} 




int main(){ 

    DoubleNode* head = NULL; 
    DoubleNode* inverseHead = NULL; 
    double d; 
    int i; 
    int sizeOfList; 

    printf("Insert amount of variables: \n"); 
    scanf("%d", &sizeOfList); 

    for (i = 0; i < sizeOfList; i++) { 
     printf("Insert variable for node [%d]: \n", i); 
     scanf("%lf", &d); 

     head = insertFirst(head, d); 
    } 

    printList(head); 

    inverseHead = inverseDoubleListCon(head); 

    printList(inverseHead); 



    return 0; 
} 
+0

Quel système d'exploitation travaillez-vous? –

+0

@JohnZwinck OS X El Capitan. J'utilise Xcode. –

+0

OK, utilisez le débogueur Xcode pour exécuter votre programme et voir exactement où il se bloque. Si vous êtes toujours coincé, dites-nous où il se bloque - quelle ligne. –

Répondre

1

Tout d'abord sizeOfList n'est pas initalised. Vous devez ajouter du code pour obtenir la valeur de la taille de l'utilisateur.

Vous ne mettez également pas à jour la valeur du pointeur de tête de la fonction insertFirst. Le code ci-dessous devrait aider.

DoubleNode* head= NULL; 

// Code to get the value of sizeofList 

for (i = 0; i < sizeOfList; i++) 
{ 
    ... 
    head = insertFirst(head, d); 
} 

La fonction inverse est trop compliquée. Vous allouez de la mémoire dans newConHead, ce qui n'est pas requis pour l'inversion d'une liste chaînée.

Je suggère une ré-écriture le long des lignes de How to reverse a singly linked list using only two pointers? ou http://www.geeksforgeeks.org/write-a-function-to-reverse-the-nodes-of-a-linked-list/

+0

Merci, je n'ai pas remarqué cela. Une telle erreur stupide. –

+0

Nous devrions implémenter deux fonctions différentes pour inverser une liste. Un dans une manière constructive (créer une nouvelle liste inversée) et l'autre de manière destructive. –