使用C编程和Linked-List但频率计数的字频率是错误的

时间:2012-05-05 03:27:13

标签: c hash linked-list frequency

我在这个问题上花了很长时间才被搜查。我需要使用C创建一个单词频率程序。为了跟踪冲突,我使用了一个链表,但是我的代码没有给出正确的频率(例如,“the”的频率应该是25,而是18的频率)。我究竟做错了什么?。这是我的代码:

void addToArr( char *str, HASH_ARR_ELEM hashArr[]){
int homeAddress = 0;
int addResult = 0;
WORD *tempWord;
homeAddress = hashFunct(str);

if(!(tempWord = (WORD*)malloc(sizeof(WORD))))
    printf("Memory Allocation Error\n"),
        exit(100);

strcpy(tempWord->str,str);
tempWord->count = 1;

if(hashArr[homeAddress].wordPtr == NULL){
    // allocate memory
    if(!(hashArr[homeAddress].wordPtr = (WORD*)malloc(sizeof(WORD))))
        printf("Memory Allocation Error\n"), exit(100);

    strcpy(hashArr[homeAddress].wordPtr->str,tempWord->str);
    hashArr[homeAddress].wordPtr->count = 1;

} else if(hashArr[homeAddress].wordPtr != NULL && hashArr[homeAddress].headPtr == NULL){        

    if(strcmp(hashArr[homeAddress].wordPtr->str,tempWord->str))
        hashArr[homeAddress].wordPtr->count++;
    else{
        hashArr[homeAddress].headPtr = createList(cmpWord);
        if(!hashArr[homeAddress].headPtr)
            printf("\aCannot create list\n"),
            exit(100);

        addNode(hashArr[homeAddress].headPtr,tempWord);
        }
}else
    if(strcmp(hashArr[homeAddress].wordPtr->str,tempWord->str))
        hashArr[homeAddress].wordPtr->count++;
    else 
    {
        addResult = addNode(hashArr[homeAddress].headPtr,tempWord);
        if(addResult != 0)
            if(addResult == -1)
                printf("Memory Overflow adding node\n"),
                    exit(120);
            else
            {
                retrieveNode(hashArr[homeAddress].headPtr,tempWord,(void**)&tempWord);
                tempWord->count++;
                    printf("%s %d\n\n", tempWord->str, tempWord->count);
            }
    }
 } // end addToArr

2 个答案:

答案 0 :(得分:2)

至少有一个问题出现在字符串比较行中。

如果两个字符串相等,则

strcmp返回0,这意味着只有在字符串不同时才递增计数。

答案 1 :(得分:0)

如果我正确读取这个,你会期望如果字符串相等则(strcmp(...))为真。但如果字符串相等则返回0。

所以这个:

if(strcmp(hashArr[homeAddress].wordPtr->str,tempWord->str))

应该是这样的:

if(!strcmp(hashArr[homeAddress].wordPtr->str,tempWord->str))

strcmp会告诉你第一个差异的位置,所以任何大于零的数字都会有差异,所以0就是字符串相等的剩余部分。