2017-02-22 7 views
-2

は、私はこれら二つの構造を持っているC.ネストされたリンクリストC

struct subject     
{ 
char *subj[100]; 
char *tutor[100]; 
char *mark[10]; 
char *date[20]; 

struct subject* next2; 
}*head2; 

struct student    
{ 
char *name[20]; 
char *surname[20]; 
int num; 
struct subject *head2; 

struct student* next1; 
}*head1; 

にリンクされたリスト内のリンクリストを作成する必要があります。私はこのような新しいノードをファイルを使ってループに追加しようとしています。

void newstudent(FILE *fp, char buffor[255], char buffor1[255]) 
{ 
struct student *temp1; 
temp1 = (struct student*) malloc(sizeof(struct student)); 
struct subject *temp2; 
temp2 = (struct subject*) malloc(sizeof(struct subject)); 
fscanf(fp, "%s", temp1->name); 
fscanf(fp, "%s", temp1->surname); 
fscanf(fp, "%d", &temp1->num); 
strcpy(temp2->subj, buffor); 
strcpy(temp2->tutor, buffor1); 
fscanf(fp, "%s", temp2->mark); 
fscanf(fp, "%s", temp2->date); 
temp1->next1 = NULL; 
head1 = temp1; 
temp2->next2 = NULL; 
head2 = temp2; 
} 

また、件名を追加する必要があるとき。

struct subject *temp2; 
temp2 = (struct subject*) malloc(sizeof(struct subject)); 
strcpy(temp2->subj, buffor); 
strcpy(temp2->tutor, buffor1); 
printf("%s %s\n",temp2->subj,temp2->tutor); 
fscanf(fp, "%s", temp2->mark); 
fscanf(fp, "%s", temp2->date); 
temp2->next2 = head2; 
head2 = temp2; 

「件名」リストから要素を表示しようとすると問題が発生します。

while(link != NULL) 
{ 

    fprintf(output, "%s %s\n", link->name,link->surname); 
    fprintf(output, "Number: %d\n", link->num); 
    struct subject *link2 = head2; 
    while (link2 != NULL) 
    { 
     fprintf(output, "%s\n", link2->subj); 
    } 

    link = link->next1; 
} 

これは実装ネストされたリストで問題だと思います。

+1

未定義の動作が多すぎます。コンパイラの警告をオンにし、読み込み、修正してから、もう一度やり直してください。 – EOF

+2

生徒は本当に20の名字ポインタと2番目の名前ポインタの配列を持っていますか?あるいは、あなたは 'char * name [20];の代わりに' 'char name [20];' 'を意図しましたか?他の構造と同様です。なぜああ、なぜ単純なケースで実験していないのですか? –

答えて

1

ループ:リンク2がnullでない場合

while (link2 != NULL) 
{ 
    fprintf(output, "%s\n", link2->subj); 
} 

は無限となります。ループ内には、である必要があります。ループ終了を行うために、ある時点でNULLを割り当てるステートメントにする必要があります。

関連する問題