2017-08-14 1 views
-1

J'essaie d'obtenir plusieurs éléments d'un fichier et de le placer dans ma liste chaînée mais il n'introduit que le dernier élément du fichier.Programmation en C, fscanf ne saisit que le dernier élément

A l'intérieur du fichier est

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 

Voici mon code

typedef struct node{ 
    int elem; 
    struct node *next; 
}node; 

void insert(node **a) 
{ 
    int temp,elem; 
    node *tempstruct; 
    tempstruct = (*node)malloc(sizeof(struct node)); 
    FILE *fp; 
    if(fp = fopen("input.txt","r")){ 
     while(fscanf(fp,"%d",&elem)==1){ 
      temp = elem%10; 
      tempstruct->elem = elem; 
      tempstruct->next = a[temp]; 
      a[temp] = tempstruct; 
     } 
    } 
} 

La sortie attendue devrait être

A[0] 10 
A[1] 11 1 
A[2] 12 2 
A[3] 13 3 
A[4] 14 4 
A[5] 15 5 
A[6] 16 6 
A[7] 17 7 
A[8] 18 8 
A[9] 19 9 

Mais ce que je reçois est

A[0] 19 
A[1] 19 
A[2] 19 
A[3] 19 
A[4] 19 
A[5] 19 
A[6] 19 
A[7] 19 
A[8] 19 
A[9] 19 

Je suis en train de mettre des éléments dans les indices correspondant à leur chiffre des unités, mais tout ce qu'il met est le dernier élément qui est 19.

+6

Votre code ne peut pas compiler. E.g '(* node)', 'temp =% elem;' – BLUEPIXY

+0

Essayez d'éviter le type de conversion de la valeur de retour de malloc. –

+0

Vous essayez trop de déboguer. D'abord, comprenez comment lire les données du fichier. Deuxièmement, comprendre comment assigner ces éléments au 'node' – KevinDTimm

Répondre

2

Vous ne convoquent que malloc une seule fois si vous vous retrouvez dans une situation où tous les les éléments du tableau pointent vers le même objet. Au lieu de cela, vous devez appeler malloc pour chaque analyse réussie.

Comme:

void insert(node **a) 
{ 
    int temp,elem; 
    node *tempstruct; 
    FILE *fp; 
    if(fp = fopen("input.txt","r")){ 
     while(fscanf(fp,"%d",&elem)==1){ 
      tempstruct = malloc(sizeof(struct node)); // malloc inside the loop 
      temp = elem % 10;  // Find the index where the new object shall be added 
      tempstruct->elem = elem; 
      tempstruct->next = a[temp]; 
      a[temp] = tempstruct; 
     } 
    } 
} 
+0

Le code est précaire: On ne sait pas comment mush de' un [] 'est valide. – chux

+0

@chux True. Malheureusement OP n'a jamais posté un exemple de code complet. Cependant, à partir de la «sortie attendue», il semble juste de supposer que «a []» a 10 éléments, c'est-à-dire 10 listes liées où les données sont triées en fonction du dernier chiffre de données. – 4386427