结构中的C增量计数器

jquia 发布于 2019-03-09 c 最后更新 2019-03-09 14:36 4 浏览

我正在做一个项目,我从文件中读取单词,将它们添加到链接列表中,然后计算单词出现的频率。我的程序正在将单词读入链表中,但是每次发生重复单词时都不会增加计数 - 计数停留在1.我不会粘贴我的整个代码,只是适用的部分。

struct node {
    struct node *next;
    char word[60];
    int wordCount;
};
推送功能:
void push_front (struct node **list, char * n) {
assert (list);
int count = 0;
struct node *temp = (struct node *)malloc (sizeof (struct node));
if (!temp) {
    fprintf (stderr, "Out of memory\n");
    exit (1);
}
if (list == NULL) {
    temp->next = *list;
    strcpy(temp->word, n);
    temp->wordCount+=1;
    *list = temp;
} else {
    while (list) {
        if (temp->word == n) {
            temp->wordCount+=1;
            exit(1);
        } else {
            temp->next = *list;
            strcpy(temp->word, n);
            temp->wordCount+=1;
            *list = temp;
            break;
        }
    }
}
return;
}
这个程序的一个例子是:
Word [0] = you, 1
Word [1] = you, 1
Word [2] = are, 1
Word [3] = a, 1
Word [4] = whipped, 1
Word [5] = what, 1
Word [6] = what, 1
Word [7] = you, 1
Word [8] = world, 1
Word [9] = you, 1
Word [10] = hello, 1
现在,您可以看到每行末尾的计数器停留在1,但每个重复的单词都应该增加,并且重复的单词也不应该添加到链接列表中。我很抱歉,我是C新手! 问候
已邀请:

nquas

赞同来自:

以下比较

if (temp->word == n) { 
是指针(地址)的比较而不是字符串的比较 C中的字符串比较不应以上述方式进行 您可以使用#include <string.h>中的strcmp
if (strcmp(temp->word, n)==0) {
并且您的函数包含一些要修复的错误。我重新执行你的功能:
void push_front (struct node **list, char * n) {    
    assert (list);
    struct node *temp = *list;
while (temp) {
        if (strcmp(temp->word, n) == 0) {
            temp->wordCount+=1;
            return;
        }
        temp = temp->next;
    }
temp = (struct node *)malloc (sizeof (struct node));
    if (!temp) {
        fprintf (stderr, "Out of memory\n");
        exit (1);
    }
    temp->next = *list;
    strcpy(temp->word, n);
    temp->wordCount=1;
    *list = temp;
    return;
}
在main()中,你的函数应该以这种方式调用
void main() {
node *head = NULL;
push_front (&head, "toto");
    push_front (&head, "titi");
    push_front (&head, "toto");
    push_front (&head, "titi");
node *tmp;
    int i=0;
    for (tmp=head; tmp!=NULL; tmp = tmp->next)
        printf("Word[%d] = %s, %d\n", i++, tmp->word, tmp->wordCount);
}
我测试了它,执行给出了以下输出:
$ ./test
Word[0] = titi, 2
Word[1] = toto, 2

ueos

赞同来自:

if (temp->word == n)
无济于事,因为您无法将字符串值与==运算符进行比较,请使用库函数strcmp,您将得到正确的结果。此外,这里:
else {
    while (list) {
        if (temp->word == n) {
            temp->wordCount+=1;
            exit(1);
        } else {
            temp->next = *list;
            strcpy(temp->word, n);
            temp->wordCount+=1;
            *list = temp;
            break;
        }
    }
}
当您进入else案例时,您尚未将templist相关联。去做。 我也认为它应该是:while(*list)