2014-12-15 2 views
3

링크 된 목록을 만드는 데 문제가 있습니다. 코드에서 오류가있는 위치를 모르겠습니다. 도와 주실 수 있습니까? 코드는 다음과 같습니다.단일 링크 된 목록을 만들 수 없습니다.

#include <stdio.h> 
#include <stdlib.h> 
#define LENGTH 255 

struct node { 
    int info; 
    struct node *next; 
} *head = NULL; 

int create(FILE **data){ 
    char read[LENGTH]; 
    printf("Write data file name: "); 
    scanf("%s", read); 
    *data = fopen (read, "r"); 

    if (data == NULL) { 
     printf("Error reading given file."); 
    } 

    return 0; 
} 

int put_Symbols_into_list(FILE *data) { 

    struct node *new_node, *current; 
    char c; 

    printf("Data given: "); 
    while (!feof(data)){ 
     new_node = (struct node*)malloc(sizeof (struct node)); 
     c = fscanf(data, "%s", &new_node -> info); 
     printf("%s ", &new_node -> info); 

     if (head == NULL){ 
      head = new_node; 
      current = new_node; 
     } else { 
      current -> next = new_node; 
      current = new_node; 
     } 
    } 

} 


int main() { 
    FILE *data; 
    struct node *n; 
    create(&data); 
    put_Symbols_into_list(data); 
    //display_List(n); 
    return 0; 
} 

내가 수행하는 단계 : 문자열에 대한 데이터 파일을 읽고 새 노드를 넣습니다. HEAD 노드에 데이터가 없으면 읽은 데이터를 그 안에 넣습니다. 그렇지 않으면 새로운 노드에 놓습니다. 데이터 파일에 데이터가 남아 있지 않을 때까지이 작업을 반복하십시오. 1 0 1 1 2 3 4 5 6과 같이 새 데이터 파일을 만들고 거기에 데이터를 넣을 수 있습니다.

+0

어디서 문제가 발생합니까? –

+0

C에서'malloc'을 형변환하지 마십시오. 디버거에서 프로그램을 단계별로 실행 해 보았습니까? – crashmstr

+0

'int '에'% d'사용 – BLUEPIXY

답변

3

새 노드를 추가 한 후 current->next을 NULL로 설정하지 않습니다. 그게 끝나는 곳을 알 수 없으므로 목록을 검토하려고 할 때 문제가됩니다. 그게 당신이 직면하고있는 문제가되기를 바랍니다.

current은 추가 한 후에 항상 new_node을 가리킬 것이므로 중복 된 코드가 있습니다. 따라서 if와 else 블록 모두에 넣지 않아도됩니다. 그냥 조언.

0

마지막 노드가 NULL을 가리키는 것을 잊었습니다. 이것은 목록을 탐색하여 표시 할 때 매우 중요합니다. 위의 답변에 추가

int put_Symbols_into_list(FILE *data) 
{ 
    struct node *new_node, *current; 
    char c; 

    printf("Data given: "); 
    while (!feof(data)){ 
     new_node = (struct node*)malloc(sizeof (struct node)); 
     c = fscanf(data, "%d", &new_node -> info); 
     printf("%d ", new_node->info); 

     if (head == NULL){ 
      head = new_node; 
      current = new_node; 
     } else { 
      current->next = new_node; 
      current = new_node; 
      new_node->next = NULL;  // << added 
     } 
    } 

    return 0; 
} 
0

, 당신은 put_Symbols_into_list에서 지역 변수로 current를 선언하고, current 초기화되지 않습니다. put_Symbols_into_list을 종료 할 때마다 current 값이 손실 될 수 있습니다. currentstatic struct node *current으로 선언하거나 매개 변수로 전달하거나 전역으로 선언해야합니다. 이 설정에서 정적 접근 방식을 선호합니다.

+0

어쨌든, 이제는 링크 된리스트 C 로직을 완전히 잃어 버렸다. 모든 것을 제대로 할 수 있다면이 모든 의견이 도움이되기를 바랍니다. 고맙습니다. –

관련 문제