Code:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define MaxWords 1000
#define MaxLength 100
#define MaxWordBuffer MaxLength+1
int main()
{
int getWord(FILE *, char[]);
int binarySearch(int, int, char [], int max, char [][max]);
void addToList(char[], int max, char [][max], int[], int, int);
void printResults(int max, char [][max], int[], int);
char wordList[MaxWords][MaxWordBuffer], word[MaxWordBuffer];
int frequency[MaxWords], numWords = 0;
FILE * in = fopen("msu1.txt", "r");
if (in == NULL)
{
printf("Cannot find file\n");
exit(1);
}
int h;
for (h = 1; h <= MaxWords ; h++) frequency[h] = 0;
while (getWord(in, word) != 0)
{
int loc = binarySearch (0, numWords-1, word, MaxWordBuffer, wordList);
if (strcmp(word, wordList[loc]) == 0) ++frequency[loc]; //word found
else //this is a new word
if (numWords < MaxWords)
{
addToList(word, MaxWordBuffer, wordList, frequency, loc, numWords-1);
++numWords;
}
//else fprintf("'%s' not added to table\n", word);
}
printResults(MaxWordBuffer, wordList, frequency, numWords);
}
int getWord(FILE * in, char str[])
{
char ch;
int n = 0;
// read over white space
while (!isalpha(ch = getc(in)) && ch != EOF) ; //empty while body
if (ch == EOF) return 0;
str[n++] = tolower(ch);
while (isalpha(ch = getc(in)) && ch != EOF)
if (n < MaxLength) str[n++] = tolower(ch);
str[n] = '\0';
return 1;
} // end getWord
int binarySearch(int lo, int hi, char key[], int max, char list[][max])
{
while (lo <= hi)
{
int mid = (lo + hi) / 2;
int cmp = strcmp(key, list[mid]);
if (cmp == 0) return mid; // found
if (cmp < 0) hi = mid - 1;
else lo = mid + 1;
}
return lo;
}
void addToList(char item[], int max, char list[][max], int freq[], int p, int n)
{
int h;
for (h = n; h >= p; h--)
{
strcpy(list[h+1], list[h]);
freq[h+1] = freq[h];
}
strcpy(list[p], item);
freq[p] = 1;
}
void printResults(int max, char list[][max], int freq[], int n)
{
int h;
printf("\nWords Frequency\n\n");
for (h = 0; h < n; h++)
printf("%d. %-15s %2d\n", h, list[h], freq[h]);
}