该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
#define WORD_MAXLENGTH 32
#define CELL_MAXNUM 4096
int hash(char word[], int maxnum)
{
const int mainFactor = 17;
const int subFactor = 11;
int i;
unsigned int hashValue = 0;
// calculate hash value
for(i = 0; word[i] > 0; i++)
{
hashValue *= (i + 1) * mainFactor;
hashValue += word[i] * (i + 1) * subFactor;
}
return hashValue % maxnum;
}
int main()
{
char words[CELL_MAXNUM][WORD_MAXLENGTH];
char currentWord[WORD_MAXLENGTH];
int wordCount[CELL_MAXNUM];
int i;
// init hash table
memset(words, 0, sizeof(words));
memset(wordCount, 0, sizeof(wordCount));
// read each word and store them into hash table
while(scanf("%s", currentWord) != EOF)
{
int hashValue;
// find space for current word
hashValue = hash(currentWord, CELL_MAXNUM);
while(strlen(words[hashValue]) > 0)
if(strcmp(words[hashValue], currentWord) != 0)
hashValue = (hashValue + 1) % CELL_MAXNUM;
else break;
// store current word
wordCount[hashValue] += 1;
strcpy(words[hashValue], currentWord);
}
// print each word
for(i = 0; i < CELL_MAXNUM; i++)
if(wordCount[i] > 0)
printf("%s: %d\n", words[i], wordCount[i]);
return 0;
}