我被困住了,花了几天时间搜索这个。我需要使用 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 Errorn"),
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 Errorn"), 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 listn"),
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 noden"),
exit(120);
else
{
retrieveNode(hashArr[homeAddress].headPtr,tempWord,(void**)&tempWord);
tempWord->count++;
printf("%s %dnn", tempWord->str, tempWord->count);
}
}
} // end addToArr
至少有一个问题在字符串比较行中。
如果两个字符串相等,strcmp
返回0
,这意味着仅当字符串不同时才递增计数。
如果我
没看错,如果字符串相等,你希望if(strcmp(...((为真。但如果字符串相等,则返回 0。
所以这个:
if(strcmp(hashArr[homeAddress].wordPtr->str,tempWord->str))
应该是这样的:
if(!strcmp(hashArr[homeAddress].wordPtr->str,tempWord->str))
strcmp 会告诉你第一个差值的位置,所以任何大于零的数字都将是一个差值,所以 0 是字符串相等的全部。