这只是我的代码片段。这个函数应该从给定的文件"dictionary.txt"中创建一个链表,该文件每行包含一个单词,但我似乎无法使链接正常工作。当我运行代码时,我正确地获得了前两个条目(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);
}
编辑:谢谢马特和interjay,把咖喱糖移到身体里,解决了我的问题。修正了我的代码。
您只分配了三个节点(在程序初始化时),并重复覆盖其中一个节点。您需要为文件中的每一行分配一个新节点。例如,可以将线curr = malloc(sizeof(WORD));
移动到while
循环体的开头。