链接列表出现问题
我正在制作出现在文件中的单词的链接列表(不重复)以及它们首次出现的行。我完成了我认为会很难的部分(解析文件的同时跟踪行),但是我相信我现在在我的一个方法中遇到问题,我无法弄清楚如何解决。我的代码有两个文件,但我只在代码中随驱动程序一起包含带有问题的方法。 (我尝试使用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;
}
插入函数返回新的列表,但是您没有在代码中使用返回值。
的呼声应该是这样的:
fIndex = insert(fIndex, i+1, token);
附录:
此外,您使用您检查之前,如果它是空令牌。它应该是这样的:
if((token!=NULL) && !present(fIndex, token)){
fIndex = insert(fIndex, i+1, token);
}
你应该经常检查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
。整段代码看起来都很贴切,缺乏正确的缩进和周围的上下文使得几乎不可能理解。我必须认为,你应该将所有这些代码分离到他们自己的例程中,使用硬编码测试彻底地测试它们,并且在试图将它连接到更大的程序之前确保它完美地工作。 (这实际上也适用于第一部分 - 它看起来会受益于一些独立的定向测试。)
我试图测试它实际上是用打印循环做出列表。 – Sams 2012-04-10 01:25:09
您看到了什么问题? – 2012-04-10 01:10:35