链接列表出现问题

问题描述:

我正在制作出现在文件中的单词的链接列表(不重复)以及它们首次出现的行。我完成了我认为会很难的部分(解析文件的同时跟踪行),但是我相信我现在在我的一个方法中遇到问题,我无法弄清楚如何解决。我的代码有两个文件,但我只在代码中随驱动程序一起包含带有问题的方法。 (我尝试使用GDB,我想我是用错了,因为它不停地说,它无法找到文件,它不会跑。)链接列表出现问题

int main(int argc, char **argv){ 
file = fopen(argv[1],"r"); 
/*struct fileIndex *fIndex = NULL;*/ /*put this in header file??*/ 
fIndex = NULL; 
delimiters = " .,;:!-";/*strtok chars to seperate*/ 
rewind(file); 
int buffer = 65; 
char str[buffer+1];/*where the lines are being stored*/ 
char *token, *cp; 
int i; 
int len; 
while((fgets(str, buffer, file))!=NULL){/*inserting lines*/ 
for(i=0; i<buffer; i++){ 
    if(str[i]=='\n'){ 
    str[i]= '\0'; 
    break; 
    } 
} 
len = strlen(str); 
cp = xerox(str); 
token = strtok(cp, delimiters); 
/*if(token!=NULL) 
printf("The word is %s\n", token);*/ 
    if(!present(fIndex, token)&&(token!=NULL)){ 
     insert(fIndex, i+1, token); 
    } 
    while(token!=NULL){ 
     token = strtok(NULL, delimiters); 
     /*if(token!=NULL) 
     printf("The word is %s\n", token);*/ 
     if(!present(fIndex, token)&&(token!=NULL)){ 
      insert(fIndex, i+1, token); 
     } 

    } 
} 
fclose(file); 
struct fileIndex *root; 
root = fIndex; 

while(root != NULL){ 
printf("The string is %s and on line %d\n", root -> str, root -> lineNum); 
root = root -> next; 
} 


free(fIndex); 
free(cp); 

return 0; 
} 







struct fileIndex *insert(struct fileIndex *head, int num, char *insert){ 
struct fileIndex* newnode = malloc(sizeof(struct fileIndex)); 
if(newnode==NULL) 
exit(1); 

newnode -> str = insert; 
newnode -> lineNum = num; 

newnode -> next = head; 
return newnode; 
} 

编辑:我还想到一个问题,我方法来检查一个单词是否已经存在或不存在。如果要插入单词并打印所有单词,我会在其中仅打印一个打印语句。最后打印列表的小循环不是打印,我认为它在第一次到达时就达到NULL,并且从不循环。

present(struct fileIndex* fIndex, char *findIt){/*finds if word is in structure*/ 
struct fileIndex* current = fIndex; 
while(current!=NULL){ 
current = current -> next; 
if(strcmpigncase(current -> str, findIt)==0){ 
    return current -> lineNum; 
} 
} 
return 0; 
} 
+1

您看到了什么问题? – 2012-04-10 01:10:35

插入函数返回新的列表,但是您没有在代码中使用返回值。

的呼声应该是这样的:

fIndex = insert(fIndex, i+1, token); 

附录:

此外,您使用您检查之前,如果它是空令牌。它应该是这样的:

if((token!=NULL) && !present(fIndex, token)){ 
    fIndex = insert(fIndex, i+1, token); 
} 
+0

我解决了这个问题,现在我得到了一个seg故障。 – Sams 2012-04-10 01:16:07

+1

你现在的函数是在while循环的顶部而不是在底部前进当前指针。 – 2012-04-10 01:17:54

+0

谢谢。我也意识到标题不正确!我忽略了返回值!应该解决我的一个逻辑问题。 – Sams 2012-04-10 01:22:41

你应该经常检查fopen()是否成功。

if(file == NULL) { 
printf("Error fopen"); 
exit(1); 
} 

fgets()追加空终止,所以您不必自己做。

file = fopen(argv[1],"r"); 

您忘记检查fopen()是否成功。每个fopen(3)应遵循类似的代码:(?回落到默认值)

if (!file) { 
    fprintf(stderr, "unable to open %s\n", argv[1]); 
    perror(argv[0]); 
    exit(EXIT_FAILURE); 
} 

如果可以更加妥善地处理错误不是退出,那么你可能想这样做。

for(i=0; i<buffer; i++){ 
    if(str[i]=='\n'){ 
    str[i]= '\0'; 
    break; 
    } 

这很丑陋。你不需要用空字符结束自己,但如果你想删除的换行符,那么你也应该确保你正在计算新行你行号...

struct fileIndex *root; 
root = fIndex; 

while(root != NULL){ 
    printf("The string is %s and on line %d\n", root -> str, root -> lineNum); 
    root = root -> next; 
} 


free(fIndex); 
free(cp); 

我从来没有真正看到fIndex分配 - 它只是一个指针,并且你在开始时指定它为NULL。整段代码看起来都很贴切,缺乏正确的缩进和周围的上下文使得几乎不可能理解。我必须认为,你应该将所有这些代码分离到他们自己的例程中,使用硬编码测试彻底地测试它们,并且在试图将它连接到更大的程序之前确保它完美地工作。 (这实际上也适用于第一部分 - 它看起来会受益于一些独立的定向测试。)

+0

我试图测试它实际上是用打印循环做出列表。 – Sams 2012-04-10 01:25:09