#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
struct Node
{
int frequency;
char word[50];
struct Node *next;
};
char *getWord(FILE *frequency)
{
char word[50];
int ch, i = 0;
while (EOF
!= (ch
= fgetc(frequency
)) && !isalpha(ch
)); //skip
if (ch == EOF)
{
return NULL;
}
do
{
}
word[i] = '\0';
return strdup(word);
}
unsigned long hash(char *str)
{
unsigned long hash = 5381;
int c;
while ((c = *str++))
{
hash = ((hash << 5) + hash) + c;
}
return hash;
}
int searchWord(struct Node *head, char *newWord)
{
int found = 0;
while (head != NULL)
{
if (strcasecmp(head->word, newWord) == 0)
{
found = 1;
head->frequency = head->frequency + 1;
return found;
}
head = head->next;
}
return found;
}
void insertWord(struct Node **head, char *newWord)
{
if ((*head) == NULL)
{
struct Node
*ptr
= malloc(sizeof (struct Node
)); if (ptr == NULL)
{
printf("\nError: Memory assignment error.\n"); return;
}
ptr->frequency = 1;
ptr->next = NULL;
(*head) = ptr;
return;
}
else if (searchWord(*head, newWord) == 1)
{
// Frequency is incremented in the Search Function
return;
}
else
{
struct Node
*ptr
= malloc(sizeof (struct Node
)); if (NULL == ptr)
{
printf("\nError: Memory assignment error.\n"); return;
}
ptr->frequency = 1;
ptr->next = NULL;
ptr->next = (*head);
(*head) = ptr;
return;
}
}
void swap(struct Node *a, struct Node *b)
{
int temp = a->frequency;
a->frequency = b->frequency;
b->frequency = temp;
char tempS[50];
}
void sortList(struct Node *start)
{
int swapped;
struct Node *ptr1;
struct Node *lptr = NULL;
if (ptr1 == NULL)
{
return;
}
do
{
swapped = 0;
ptr1 = start;
while (ptr1->next != lptr)
{
if (ptr1->frequency < ptr1->next->frequency)
{
swap(ptr1, ptr1->next);
swapped = 1;
}
ptr1 = ptr1->next;
}
lptr = ptr1;
}
while (swapped);
}
void printList(struct Node *head)
{
int counter = 0;
printf("\n\nWord \t\tOccurrences\n"); printf("---------------------------\n"); if (head != NULL)
{
while (head && counter < 1000)
{
printf("%-20s %i\n", head
->word
, head
->frequency
); head = head->next;
counter++;
}
}
}
void freeLink(struct Node *head)
{
struct Node* current = head;
while (current != NULL)
{
struct Node* next = current->next;
current = next;
}
current = NULL;
}
int main(int argc, char** argv)
{
FILE *data;
struct Node *head = NULL;
char *word;
if (argc <= 2)
{
printf("Please Re-Run. Enter FileName and Optional Hashing (0/1).\n"); }
else if (argc == 3)
{
data
= fopen(argv
[1], "r");
if (data != NULL && (int)(argv[2][0] - '0') == 0)
{
while ((word = getWord(data)) != NULL)
{
insertWord(&head, word);
}
}
else if (data != NULL && (int)(argv[2][0] - '0') == 1)
{
while ((word = getWord(data)) != NULL)
{
insertWord(&head, word);
}
}
else
{
printf("\nError: Unable to open file or invalid option\n"); }
}
else
{
printf("\nError: Too Many Arguments\n"); }
// Sorting
sortList(head);
// Printing
printList(head);
// Free Links
freeLink(head);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCnN0cnVjdCBOb2RlCnsKICAgIGludCBmcmVxdWVuY3k7CiAgICBjaGFyIHdvcmRbNTBdOwogICAgc3RydWN0IE5vZGUgKm5leHQ7Cn07CgpjaGFyICpnZXRXb3JkKEZJTEUgKmZyZXF1ZW5jeSkKewogICAgY2hhciB3b3JkWzUwXTsKICAgIGludCBjaCwgaSA9IDA7CgogICAgd2hpbGUgKEVPRiAhPSAoY2ggPSBmZ2V0YyhmcmVxdWVuY3kpKSAmJiAhaXNhbHBoYShjaCkpOyAvL3NraXAKCiAgICBpZiAoY2ggPT0gRU9GKQogICAgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgZG8KICAgIHsKICAgICAgICB3b3JkW2krK10gPSB0b2xvd2VyKGNoKTsKICAgIH0KICAgIHdoaWxlIChFT0YgIT0gKGNoID0gZmdldGMoZnJlcXVlbmN5KSkgJiYgaXNhbHBoYShjaCkpOwoKICAgIHdvcmRbaV0gPSAnXDAnOwogICAgcmV0dXJuIHN0cmR1cCh3b3JkKTsKfQoKdW5zaWduZWQgbG9uZyBoYXNoKGNoYXIgKnN0cikKewogICAgdW5zaWduZWQgbG9uZyBoYXNoID0gNTM4MTsKICAgIGludCBjOwoKICAgIHdoaWxlICgoYyA9ICpzdHIrKykpCiAgICB7CiAgICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSArIGhhc2gpICsgYzsKICAgIH0KICAgIHJldHVybiBoYXNoOwp9CgppbnQgc2VhcmNoV29yZChzdHJ1Y3QgTm9kZSAqaGVhZCwgY2hhciAqbmV3V29yZCkKewogICAgaW50IGZvdW5kID0gMDsKICAgIAogICAgd2hpbGUgKGhlYWQgIT0gTlVMTCkKICAgIHsKICAgICAgICBpZiAoc3RyY2FzZWNtcChoZWFkLT53b3JkLCBuZXdXb3JkKSA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgZm91bmQgPSAxOwogICAgICAgICAgICBoZWFkLT5mcmVxdWVuY3kgPSBoZWFkLT5mcmVxdWVuY3kgKyAxOwogICAgICAgICAgICByZXR1cm4gZm91bmQ7CiAgICAgICAgfQoKICAgICAgICBoZWFkID0gaGVhZC0+bmV4dDsKICAgIH0KICAgIHJldHVybiBmb3VuZDsKfQoKdm9pZCBpbnNlcnRXb3JkKHN0cnVjdCBOb2RlICoqaGVhZCwgY2hhciAqbmV3V29yZCkKewogICAgaWYgKCgqaGVhZCkgPT0gTlVMTCkKICAgIHsKICAgICAgICBzdHJ1Y3QgTm9kZSAqcHRyID0gbWFsbG9jKHNpemVvZiAoc3RydWN0IE5vZGUpKTsKICAgICAgICBpZiAocHRyID09IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIlxuRXJyb3I6IE1lbW9yeSBhc3NpZ25tZW50IGVycm9yLlxuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcHRyLT5mcmVxdWVuY3kgPSAxOwogICAgICAgIHN0cmNweShwdHItPndvcmQsIG5ld1dvcmQpOwogICAgICAgIHB0ci0+bmV4dCA9IE5VTEw7CgogICAgICAgICgqaGVhZCkgPSBwdHI7CiAgICAgICAgCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGVsc2UgaWYgKHNlYXJjaFdvcmQoKmhlYWQsIG5ld1dvcmQpID09IDEpCiAgICB7CiAgICAgICAgLy8gRnJlcXVlbmN5IGlzIGluY3JlbWVudGVkIGluIHRoZSBTZWFyY2ggRnVuY3Rpb24KICAgICAgICByZXR1cm47CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgc3RydWN0IE5vZGUgKnB0ciA9IG1hbGxvYyhzaXplb2YgKHN0cnVjdCBOb2RlKSk7CiAgICAgICAgaWYgKE5VTEwgPT0gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRmKCJcbkVycm9yOiBNZW1vcnkgYXNzaWdubWVudCBlcnJvci5cbiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHB0ci0+ZnJlcXVlbmN5ID0gMTsKICAgICAgICBzdHJjcHkocHRyLT53b3JkLCBuZXdXb3JkKTsKICAgICAgICBwdHItPm5leHQgPSBOVUxMOwoKICAgICAgICBwdHItPm5leHQgPSAoKmhlYWQpOwogICAgICAgICgqaGVhZCkgPSBwdHI7CgogICAgICAgIHJldHVybjsKICAgIH0KfQoKdm9pZCBzd2FwKHN0cnVjdCBOb2RlICphLCBzdHJ1Y3QgTm9kZSAqYikKeyAgIAogICAgaW50IHRlbXAgPSBhLT5mcmVxdWVuY3k7CiAgICBhLT5mcmVxdWVuY3kgPSBiLT5mcmVxdWVuY3k7CiAgICBiLT5mcmVxdWVuY3kgPSB0ZW1wOwogICAgCiAgICBjaGFyIHRlbXBTWzUwXTsKICAgIHN0cmNweSh0ZW1wUywgYS0+d29yZCk7CiAgICBzdHJjcHkoYS0+d29yZCxiLT53b3JkKTsKICAgIHN0cmNweShiLT53b3JkLHRlbXBTKTsgICAgCn0KCnZvaWQgc29ydExpc3Qoc3RydWN0IE5vZGUgKnN0YXJ0KQp7CiAgICBpbnQgc3dhcHBlZDsKICAgIHN0cnVjdCBOb2RlICpwdHIxOwogICAgc3RydWN0IE5vZGUgKmxwdHIgPSBOVUxMOwogICAgCiAgICBpZiAocHRyMSA9PSBOVUxMKQogICAgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGRvCiAgICB7CiAgICAgICAgc3dhcHBlZCA9IDA7CiAgICAgICAgcHRyMSA9IHN0YXJ0OwoKICAgICAgICB3aGlsZSAocHRyMS0+bmV4dCAhPSBscHRyKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHB0cjEtPmZyZXF1ZW5jeSA8IHB0cjEtPm5leHQtPmZyZXF1ZW5jeSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3dhcChwdHIxLCBwdHIxLT5uZXh0KTsKICAgICAgICAgICAgICAgIHN3YXBwZWQgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHB0cjEgPSBwdHIxLT5uZXh0OwogICAgICAgIH0KICAgICAgICBscHRyID0gcHRyMTsKICAgIH0KICAgIHdoaWxlIChzd2FwcGVkKTsKfQoKdm9pZCBwcmludExpc3Qoc3RydWN0IE5vZGUgKmhlYWQpCnsKICAgIGludCBjb3VudGVyID0gMDsKICAgIHByaW50ZigiXG5cbldvcmQgXHRcdE9jY3VycmVuY2VzXG4iKTsKICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgIGlmIChoZWFkICE9IE5VTEwpCiAgICB7CiAgICAgICAgd2hpbGUgKGhlYWQgJiYgY291bnRlciA8IDEwMDApCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIiUtMjBzICVpXG4iLCBoZWFkLT53b3JkLCBoZWFkLT5mcmVxdWVuY3kpOwogICAgICAgICAgICBoZWFkID0gaGVhZC0+bmV4dDsKICAgICAgICAgICAgY291bnRlcisrOwogICAgICAgIH0KICAgIH0KfQoKdm9pZCBmcmVlTGluayhzdHJ1Y3QgTm9kZSAqaGVhZCkKewogICAgc3RydWN0IE5vZGUqIGN1cnJlbnQgPSBoZWFkOwogICAgd2hpbGUgKGN1cnJlbnQgIT0gTlVMTCkKICAgIHsKICAgICAgICBzdHJ1Y3QgTm9kZSogbmV4dCA9IGN1cnJlbnQtPm5leHQ7CiAgICAgICAgZnJlZShjdXJyZW50KTsKICAgICAgICBjdXJyZW50ID0gbmV4dDsKICAgIH0KICAgIGN1cnJlbnQgPSBOVUxMOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCnsKICAgIEZJTEUgKmRhdGE7CgogICAgc3RydWN0IE5vZGUgKmhlYWQgPSBOVUxMOwogICAgY2hhciAqd29yZDsKCiAgICBpZiAoYXJnYyA8PSAyKQogICAgewogICAgICAgIHByaW50ZigiUGxlYXNlIFJlLVJ1bi4gRW50ZXIgRmlsZU5hbWUgYW5kIE9wdGlvbmFsIEhhc2hpbmcgKDAvMSkuXG4iKTsKICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CiAgICB9CiAgICBlbHNlIGlmIChhcmdjID09IDMpCiAgICB7CiAgICAgICAgZGF0YSA9IGZvcGVuKGFyZ3ZbMV0sICJyIik7CgogICAgICAgIGlmIChkYXRhICE9IE5VTEwgJiYgKGludCkoYXJndlsyXVswXSAtICcwJykgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHdoaWxlICgod29yZCA9IGdldFdvcmQoZGF0YSkpICE9IE5VTEwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGluc2VydFdvcmQoJmhlYWQsIHdvcmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGRhdGEgIT0gTlVMTCAmJiAoaW50KShhcmd2WzJdWzBdIC0gJzAnKSA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgd2hpbGUgKCh3b3JkID0gZ2V0V29yZChkYXRhKSkgIT0gTlVMTCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3ByaW50Zih3b3JkLCAiJWx1IiwgaGFzaCh3b3JkKSk7CiAgICAgICAgICAgICAgICBpbnNlcnRXb3JkKCZoZWFkLCB3b3JkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIlxuRXJyb3I6IFVuYWJsZSB0byBvcGVuIGZpbGUgb3IgaW52YWxpZCBvcHRpb25cbiIpOwogICAgICAgIH0KICAgICAgICBmY2xvc2UoZGF0YSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcHJpbnRmKCJcbkVycm9yOiBUb28gTWFueSBBcmd1bWVudHNcbiIpOwogICAgfQoKICAgIC8vIFNvcnRpbmcKICAgIHNvcnRMaXN0KGhlYWQpOwogICAKICAgIC8vIFByaW50aW5nCiAgICBwcmludExpc3QoaGVhZCk7CiAgICAKICAgIC8vIEZyZWUgTGlua3MKICAgIGZyZWVMaW5rKGhlYWQpOyAgIAp9Cgo=