2016-12-19 14 views
0

私は、リンクされたリストを使って、私が練習していた以前のプログラムを更新しようとしています。 私は、バスの座席数を含むtxtファイルを持っています。このbus.txtファイルを読むと、特定のリンクされたリストとnumberofseats(たとえば45人の座席)のためのメモリの動的割り当てが行われます。 私は次のコードを書いて、どのように動作するかテストし、各乗客のフルネームにAを入れようとしています.45席を印刷して、うまく動作するかどうか確認します。無限ループを取得し、Aは永遠に印刷されます。 何が欠けていますか?リンクされたリストの初期化

#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

1回のmalloc呼び出しでN個のPASSENGERSの*配列*を割り当てました。それらを順番に配列に割り当てることを意味しましたか?もしそうなら、なぜですか?通常は、一度に1つずつ、乗客ごとに1つずつ割り当てて、リンクします。 – jarmod

+0

これはリンクされたリストではありません。リンクされたリストで**ノードを**追加**削除**ノードを動的にすることができます。あなたはあなたのやり方でどちらかをすることはできません。 –

答えて

0

ありがとうございました!私はあなたのコメントに応じてリンクされたリストにするために、自分のコードを変更して、それは機能の外で動作します。しかし、関数の中に渡そうとすると、まだいくつかの問題があります。

#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

どのような問題がありますか? –

関連する問題