2013-12-11 2 views
0

Это всего лишь фрагмент моего кода. Эта функция должна создать связанный список из заданного файла «dictionary.txt», который содержит по одному слову в каждой строке, но я просто не могу заставить ссылки работать правильно. Когда я запускаю код, я получаю первые 2 записи должным образом (a, aa), но затем он пропускает прямо к последней записи (zyzzyvas) и сбою seg и пропускает все остальные 80000 или около того записей.Связанный список не правильно связан

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

typedef struct word { 
    char entry[64]; 
    struct word *next; 
} WORD; 

WORD *Dstart, *Dend, *curr; 

WORD* makeDictionary() { 

    FILE *fp; 
    fp=fopen("dictionary.txt","r"); 

    fgets(Dstart->entry,63,fp); 
    fgets(Dend->entry,63,fp); 
    Dstart->next=Dend; 
    int count=1; 
    while(!feof(fp)) 
    { 
     curr = (WORD *) malloc(sizeof(WORD)); 
     fgets(curr->entry,63,fp); 
     Dend->next=curr; 
     Dend=Dend->next; 
     Dend->next=NULL; 
     count++; 
    } 
    int i; 
    curr=Dstart; 
    for (i=1;i<=20;i++) //Just to test if it's linking 
    { 
     printf("%s",curr->entry); 
     curr=curr->next; 
    } 
} 

int main { 

    // curr = (WORD *) malloc(sizeof(WORD)); moved to the while loop 
    Dstart = (WORD *) malloc(sizeof(WORD)); 
    Dend = (WORD *) malloc(sizeof(WORD)); 
    Dstart->next=NULL; 
    Dend->next=NULL; 

    makeDictionary(); 
    return(0); 
} 

Edit: Спасибо Matt и interjay, перемещая ТОК таНос в тело в то время как фиксированной проблемы у меня был. Исправлен мой код.

+0

oh 'fgets' - мы снова встречаемся. – ryrich

+0

Вам действительно нужно добавить некоторые детали здесь: компилятор испускает любые сообщения? Как это не ведет себя так, как ожидалось? Не просите нас прочитать ваш код, найти проблемы, * и * отладить его для вас. Вам нужно задать конкретный вопрос. –

+1

'Dstart-> next = Dend;' когда это утверждение будет достигнуто 'Dstart' не указывает ни на что. – wildplasser

ответ

1

Вы только когда-либо выделяете три узла (при инициализации программы) и перезаписываете один из них повторно. Вы должны выделить новый узел для каждой строки в файле. Например, вы можете переместить линию curr = malloc(sizeof(WORD)); в начало тела петли .

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