Gvalder
Gvalder

Reputation: 74

Segmentation fault in hash function (C)

I decided that I wanted to make a program in C that would take a user input and do things with a hash table... well I have hit a snag and I am completely lost as to what is going on. When I run my code everything is fine until I give an input then I get a segmentation fault. Is there anyone out there that can point out my mistake? When the user gives an input the program will decide where to put the word(s) by the total of the letters in ascii. Once I get this issue fixed I will add it in so that if there is a collision it will incriment by something like 7 until it finds a place to go.

  #include <stdio.h>
  #include <string.h>
  #include <stdlib.h>

  struct hash *hashTable = NULL;
  int eleCount = 0;

  struct node {
        int key;
        char name[1024];
        struct node *next;
  };

  struct hash {
        struct node *head;
        int count;
  };

  struct node * createNode(int key, char *name) {
        struct node *newnode;
        newnode = (struct node *)malloc(sizeof(struct node));
        newnode->key = key;
        strcpy(newnode->name, name);
        newnode->next = NULL;
        return newnode;
  }


  void insertToHash(int key, char *name) {
        int hashIndex = key % eleCount;
        struct node *newnode =  createNode(key, name);
        if (!hashTable[hashIndex].head) {
                hashTable[hashIndex].head = newnode;
                hashTable[hashIndex].count = 1;
                return;
        }
        newnode->next = (hashTable[hashIndex].head);
        hashTable[hashIndex].head = newnode;
        hashTable[hashIndex].count++;
        return;
  }
  void deleteFromHash(int key) {
        int hashIndex = key % eleCount, flag = 0;
        struct node *temp, *myNode;
        myNode = hashTable[hashIndex].head;
        if (!myNode) {
                printf("Word not in hash Table!!\n");
                return;
        }
        temp = myNode;
        while (myNode != NULL) {
                if (myNode->key == key) {
                        flag = 1;
                        if (myNode == hashTable[hashIndex].head)
                                hashTable[hashIndex].head = myNode->next;
                        else
                                temp->next = myNode->next;

                        hashTable[hashIndex].count--;
                        free(myNode);
                        break;
                }
                temp = myNode;
                myNode = myNode->next;
        }
        if (flag)
                printf("Word deleted from Hash Table by the power of Grey Skull\n");
        else
                printf("Word is not present in hash Table!\n");
        return;
  }

  void searchInHash(int key) {
        int hashIndex = key % eleCount, flag = 0;
        struct node *myNode;
        myNode = hashTable[hashIndex].head;
        if (!myNode) {
                printf("Searched word not in hash table\n");
                return;
        }
        while (myNode != NULL) {
                if (myNode->key == key) {
                        printf("Key      : %d\n", myNode->key);
                        printf("Name     : %s\n", myNode->name);
                        flag = 1;
                        break;
                }
                myNode = myNode->next;
        }
        if (!flag)
                printf("Searched word not in hash table\n");
        return;
  }

  void display() {
        struct node *myNode;
        int i;
        for (i = 0; i < eleCount; i++) {
                if (hashTable[i].count == 0)
                        continue;
                myNode = hashTable[i].head;
                if (!myNode)
                        continue;
                printf("Key         Word\n");
                printf("----------------\n");
                while (myNode != NULL) {
                        printf("%-12d", myNode->key);
                        printf("%-15s", myNode->name);
                        myNode = myNode->next;
                }
        }
        return;
  }

  int main() {
        int n, ch, key, i;
        char name[1024],cas[5];
        eleCount = 23;
        hashTable = (struct hash *)calloc(n, sizeof (struct hash));
        while (1) {
                printf("\nword: Insert word\n#d: word Delete word\n");
                printf("#s word: Search for word\n#p: Display hash table\n#Q: Exit\n");
                printf("Enter your choice:");
                fgets(name, 1023, stdin);
                if(sscanf(name,"#d",&cas)==1)
                    {//delete
                    i=2;
                    while(name[i]!='\0')
                    {key=key+i;
                    i++;}
                    deleteFromHash(key);
                    }
                else if(sscanf(name,"#s",&cas)==1)
                    {//search
                    i=2;
                    while(name[i]!='\0')
                    {key=key+i;
                    i++;}
                    searchInHash(key);
                    }
                else if(sscanf(name,"#p",&cas)==1)
                    {//print
                    display();
                    }
                else if(sscanf(name,"#Q",&cas)==1)
                    {//Quit
                    exit(0);
                    }
                else
                    {//insert
                    while(name[i]!='\0')
                    {key=key+i;
                    i++;}
                    name[strlen(name) - 1] = '\0';
                    insertToHash(key, name);
                    }
                }

        return 0;
  }

Upvotes: 0

Views: 563

Answers (2)

Giorgi Moniava
Giorgi Moniava

Reputation: 28654

Here

hashTable = (struct hash *)calloc(n, sizeof (struct hash));

You are calling calloc but you never initialized n; neither is the variable key initialized.

Upvotes: 1

unwind
unwind

Reputation: 399871

You never seem to initialize i properly.

Also, you're using # instead of % in the sscanf() format strings. I don't understand the logic around those else ifs with same sccanf() calls either, I don't think that's right.

You seem to use sscanf() instead of strcmp() to just compare strings?

Upvotes: 0

Related Questions