2015-11-20 2 views
1

Моей структура определяются следующим образом:Как вы читаете файл строк в связанном списке? (C)

typedef struct node { 
    char * word; 
    int wordLength; 
    int level; 
    struct node * parent; 
    struct node * next; 
}Node; 

Я пытаюсь создать связанный список из приведенных выше структур, где «слово» является строкой, которая считывается из файла. Ниже приведена функция, которую я использую для создания списка. Кажется, что он работает нормально и печатает слова, но затем, когда я пытаюсь распечатать его в main(), он ничего не печатает.

void GetWords(char * dictionary, Node * Word, Node * Start) 
{ 
    FILE *fp; 
    char * currentWord = (char *)malloc(sizeof(char)); 
    fp = fopen(dictionary, "r"); 
    ErrorCheckFile(fp); 
    if(fscanf(fp, "%s", currentWord) == 1){ 
    Start = Word = AllocateWords(currentWord); 
    } 

    while((fscanf(fp, "%s", currentWord)) != EOF){ 
    Word->next = AllocateWords(currentWord); 
    Word = Word->next; 
    printf("%s: %d\n", Word->word, Word->wordLength); 
    } 



    fclose(fp); 
} 

Должен ли я вернуться в начало списка? Если да, то как мне это сделать? В этой функции у меня есть «Пуск», указывающий на первое слово в файле, мне это нужно? Я пытаюсь напечатать их, чтобы быть уверенным, что файл правильно хранится в списке.

Моя основная функция() является:

int main(int argc, char ** argv) 
{ 
    Node * Word = (Node *)malloc(sizeof(Node)); 
    Node * Start = (Node *)malloc(sizeof(Node)); 
    GetWords(argv[1], Word, &Start); 


    printf("Start: %s\n", Start->word); 
    printf("Word: %s\n", Word->word); 
    while(Word->next != NULL){ 
    printf("%s\n", Word->word); 
    } 

    return 0; 
} 

Операторы печати только там, чтобы проверить список печати. В этом случае Start-> word печатает последнее слово в файле и Word-> word печатает (null), а цикл while не выполняется вообще. Функция

Мои AllocateWords() выглядит следующим образом:

Node * AllocateWords(char * string) 
{ 
    Node * p; 
    p = (Node *)malloc(sizeof(Node)); 
    if(p == NULL){ 
    fprintf(stderr, "ERROR: Cannot allocate space...\n\n"); 
    exit(1); 
    } 
    p->word = string; 
    p->wordLength = strlen(p->word); 
    p->parent = NULL; 
    p->next = NULL; 
    return p; 
} 
+2

'SizeOf (Char)' 1, что очень мало места для хранения строки в. –

+0

Там же проблема, что '' слово' и Start' являются локальными переменными. Изменения, внесенные вами, не будут возвращены в функцию, из которой вызывается «GetWords». –

ответ

1

Использование вызова по ссылке, вместо вызова по значению для Start указателя.

основная функция():

Node * Start 

GetWords(..., &Start) 

и

void GetWords(char * dictionary, Node * Word, Node ** Start) 
{ 

    .... 
    *Start = Word = AllocateWords(currentWord); 
    .... 

Вы также должны установить размер currentWord. Если максимальная длина слова 255 символов, используйте:

char * currentWord = (char *)malloc(256*sizeof(char)); 
... 
if(fscanf(fp, "%255s", currentWord) == 1){ 
... 
while((fscanf(fp, "%255s", currentWord)) != EOF){ 

Вы должны также исправить вашу основную функцию(). Вам не нужно выделять указатель текущего слова Word или Start Указатель узла.

... 
Node * Word = (Node *) NULL; 
Node * Start = (Node *) NULL; 
GetWords(argv[1], Word, &Start); 

printf("Start: %s\n", Start->word); 
Word = Start; 
while(Word->next){   // identical to while(World->next!=NULL){  
    Word=Word->next; 
    printf("%s\n", Word->word); 
} 
+0

Спасибо! Единственная проблема заключается в том, что когда я печатаю «Start» в main(), он указывает на последнее слово в файле, а не на первое (где я должен был указывать) – liamw9

+0

@ liamw9 Можете ли вы перечислить ' AllocateWords' и ваша процедура вывода - mabye ошибка где-то там. – jofel

+0

Я только что добавил редактирование, чтобы включить эти функции. – liamw9

Смежные вопросы