2016-12-19 2 views
0

J'essaie de mettre à jour un programme précédent sur lequel je m'entraînais, en utilisant des listes chaînées, pour voir comment ils fonctionnaient. J'ai un fichier txt qui inclut le nombre de sièges d'un bus. La lecture de ce fichier bus.txt est suivie d'une allocation dynamique de la mémoire pour la liste liée spécifique et numberofseats .. (Par exemple 45 sièges). J'écris le code suivant, juste pour tester comment cela fonctionne, et j'essaie de mettre A dans le nom complet de chaque passager, 0 pour le phonenr etc. Lorsque j'essaie d'imprimer les 45 sièges pour voir si cela fonctionne, je obtenir une boucle infinie et A sont imprimés pour toujours .. Que manque-t-il?Initialisation de la liste chaînée

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

int i,j,numberofseats,temp;  
char platenr[8],selection;  
char firstname[20],lastname[20]; 
char phone[11];     
char *p;       

typedef struct psg    
    { 
    char fullname[40]; 
    unsigned short phonenr[10]; 
    unsigned int seatnr;   
    struct psg *next 
    }PASSENGERS;     


PASSENGERS* readfile(char *platenr, int *seatnr) 
    { 
    char buff[60]; 
    FILE *businfo; 
    businfo = fopen ("bus.txt","r"); 
    if (businfo == NULL) 
     { 
     printf("Error Opening File, check if file bus.txt is present"); 
     exit(1); 
     } 
    else            
     { 
     fscanf(businfo,"%s %d",platenr, seatnr); 
     printf("Bus Licence plate Nr is: %s, and Number of Seats is: %d", platenr, *seatnr); 
     PASSENGERS *p = malloc(*seatnr * sizeof(PASSENGERS)); 
     if (p==NULL)    
     { 
      puts("Unable to allocate memory"); 
      exit(1); 
     } 
     return p;              
     } 

    } 



int main() 
{ 
PASSENGERS *passenger, *tmp, *start=NULL; 
passenger = readfile(platenr,&numberofseats); 
for (i=0;i<numberofseats;i++) 
    { 
    passenger->next=NULL; 
    strcpy (passenger->fullname,"A"); 
    passenger->seatnr=i+1; 
    for (j=0;j<10;j++) 
     passenger->phonenr[j]=0; 
    if (start==NULL) 
     start=passenger; 
    else{ 
     tmp=start; 
    while (tmp->next !=NULL) tmp=tmp->next; 
    tmp->next=passenger; 
    } 
    } 
tmp=start; 
while(tmp!=NULL) 
{ 
    printf ("%s",tmp->fullname); 
    tmp=tmp->next; 
} 
} 
+0

Vous avez alloué un * tableau * de N PASSENGERS en un seul appel malloc. Vouliez-vous les allouer séquentiellement dans un tableau? Si oui, pourquoi? Habituellement, vous les répartissez un à la fois, un par passager et les liez ensemble. – jarmod

+0

Cette liste n'est pas indexée. Dans une liste chaînée, vous pouvez ** ajouter ** et ** supprimer ** des nœuds dynamiquement. Vous ne pouvez pas faire non plus sur votre chemin. –

Répondre

0

Merci à tous! J'ai changé mon code, pour en faire une liste chaînée en fonction de vos commentaires, et cela fonctionne en dehors d'une fonction. Toutefois, lorsque j'essaie de le passer à l'intérieur d'une fonction, j'ai encore des problèmes.

#include <stdio.h>    
#include <string.h>    
#include <stdlib.h>    
int i,j,numberofseats,temp;  
char platenr[8],selection;  
char firstname[20],lastname[20]; 
char phone[11];     
char *p;       

typedef struct psg     { 
    char fullname[40]; 
    unsigned short phonenr[10]; 
    unsigned int seatnr;   
    struct psg *next 
    }PASSENGERS;     

void readfile(char *platenr, int *seatnr, PASSENGERS passenger,PASSENGERS tmp, PASSENGERS start) 
    { 
    char buff[60]; 
    FILE *businfo; 
    businfo = fopen ("bus.txt","r"); 
    if (businfo == NULL) 
     { 
     printf("Error Opening File, check if file bus.txt is present"); 
     exit(1); 
     } 
    else                 
     { 
     fscanf(businfo,"%s %d",platenr, seatnr);  
     printf("Bus Licence plate Nr is: %s, and Number of Seats is: %d", platenr, *seatnr); 
     for (i=0;i<numberofseats;i++) 
     { 
     passenger = (PASSENGERS *) malloc (sizeof(PASSENGERS)); 
     if (p==NULL)    
      { 
      puts("Unable to allocate memory"); 
      exit(1); 
      } 
     passenger->next=NULL; 
     strcpy (passenger->fullname,"A"); 
     passenger->seatnr=i+1; 
     for (j=0;j<10;j++) 
      passenger->phonenr[j]=0; 
     if (start==NULL) 
      start=passenger; 
     else{ 
      tmp=start; 
     while (tmp->next !=NULL) tmp=tmp->next; 
     tmp->next=passenger; 
      } 
     } 
     tmp=start; 
     while(tmp!=NULL) 
      { 
      printf ("%s",tmp->fullname); 
      tmp=tmp->next; 
      } 

     return p;              
     } 

    } 



int main() 
{ 
PASSENGERS *passenger, *tmp, *start=NULL; 
readfile(platenr,&numberofseats, passenger, tmp, start,); 

} 
+0

Quels problèmes exactement? –