2012-05-05 13 views
-1

私はこんなに過ごした日に詰まっています。私はCを使って単語の周波数プログラムを作成する必要があります。衝突を追跡するために、私はリンクされたリストを使用しますが、私のコードは正しい周波数を与えません(例えば、 "the"のfrequncyは25でなければなりません。私は間違って何をしていますか?ここに私のコードです:Cのプログラミングとリンクされたリストを使用しているが、頻度カウントが間違っている単語の頻度が

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

少なくとも1つの問題は、文字列比較行にあります。

strcmpは、2つの文字列が等しい場合は0を返します。つまり、文字列が異なる場合にのみカウントが増加します。

+0

問題が解決しました。あなたに感謝した問題 – TheMadKoder

0

これを正しく読んでいる場合は、文字列が等しい場合に(strcmp(...))がtrueであると予想されます。しかし、文字列が等しい場合は0を返します。

ので、この:

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

は、このことが必要です。

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

のstrcmpはあなたの最初の差異の位置を教えてくれますので、ゼロより大きい任意の数はそう、違いになるだろう0は文字列が等しくなるために残されたすべてです。

+0

ありがとう! – TheMadKoder

関連する問題