Reputation: 74
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
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
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 if
s 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