链接列表没有正确链接

时间:2013-12-11 15:05:28

标签: c linked-list

这只是我代码的一小部分。这个函数应该从给定文件“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);
}

编辑:谢谢Matt和interjay,将curr malloc移动到while body中解决了我遇到的问题。修正了我的代码。

1 个答案:

答案 0 :(得分:1)

您只需要分配三个节点(在程序初始化时),并重复覆盖其中一个节点。您需要为文件中的每一行分配一个新节点。例如,您可以将行curr = malloc(sizeof(WORD));移动到while循环体的开头。