2016-05-06 47 views
-1

プログラムはうまく動作し、私が望むデータを表示しますが、クラッシュします。私はそれを解放するために多くの方法を試してきたし、誰も働いていないので、リンクされたリストからのメモリリークだとは思わない。実行後にプログラムが終了しますか?

#include "Buildings.h" 

void displayBuilding(struct node *x){ 
    printf("Building Name: %s\n\tFloors: %d\n\tValue: %d\n\n", x->payload.name, x->payload.floors, x->payload.value); 
    if(x->last!=1){ 
     displayBuilding(x->next); 
    } 
} 

void insert(struct node *x, char str[50]){ 
    srand(t); 
    int f = (rand() % 6)+1; 
    int v = ((rand() % 20)+1)*f; 
    //printf("Floors: %d and Value: %d\n", f, v); 
    strcpy(x->payload.name, str); 
    x->payload.floors = f; 
    x->payload.value = v; 
    srand(time(NULL)); 
    t+=f+v*(rand()%1000); 
} 

FILE* openData(FILE *f){ 
    f = fopen("Buildings-Data.txt", "r"); 
    if(f==NULL){ 
     printf("No File!"); 
     return 0; 
    } 
    return f; 
} 

void freeList(struct node* head) 
{ 
    struct node* tmp; 

    while (head != NULL) 
    { 
     tmp = head; 
     head = head->next; 
     free(tmp); 
    } 

} 

int main(){ 
    FILE *f1; 
    struct node *head; 
    struct node *curr; 
    head = malloc(sizeof(struct node)); 
    curr = malloc(sizeof(struct node)); 

    curr = head; 
    int i; 
    for(i=0;i<9;i++){ 
     curr->next = malloc(sizeof(struct node)); 
     curr = curr->next; 
    } 
    f1 = openData(f1); 
    curr = head; 
    int readNum; 
    char trash; 
    fscanf(f1, "%d", &readNum); 
    fscanf(f1, "%c", &trash); 
    for(i=0;i<readNum;i++){ 
     char str[50]; 
     fscanf(f1, "%s",str); 
     insert(curr, str); 
     curr->last = 0; 
     if(readNum-i==1){ 
      curr->last = 1; 
     }else{ 
      curr = curr->next; 
     } 
    } 
    fscanf(f1, "%c", &trash); 
    fclose(f1); 
    curr = head; 
    printf("\n"); 
    displayBuilding(curr); 

    curr = head; 
    freeList(head); 

    return 0; 
} 

私のヘッダファイル:

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

struct building{ 
    char name[50]; 
    int floors; 
    int value; 
}; 
typedef struct building place; 

struct node{ 
    place payload; 
    struct node *next; 
    int last; 
}; 

int t = 500; 
+0

'freeList(head);'をコメントアウトしてください。今何が起こるのですか? –

+0

デバッグ101: '疑問があれば、コメントアウトしてください'。 –

+0

一般的にグローバル変数を使用することはお勧めできません。また、グローバル変数には1文字の名前を使用することをお勧めしません。ヘッダー内のグローバル変数を初期化することは絶対にお勧めしませんプログラム内の1つのソースファイルだけがヘッダーを使用できることを意味し、1つのソースファイルだけがヘッダーを使用する場合は、ヘッダーを作成する必要はありません。 –

答えて

1

問題は、リンクリストを作成するとき、あなたはリストの最後のノードでNULLnextを設定したことがないということです。このため

for(i=0;i<9;i++){ 
    curr->next = malloc(sizeof(struct node)); 
    curr = curr->next; 
} 
curr->next = NULL; 

freeList()while (head != NULL)ループは停止していない、と最終的にはリストの最後のノードで初期化されていないポインタを解放しようとするん:あなたは、ループの後ことを行う必要があります。

関連する問題