哈希函数中的分段错误 (C)
Segmentation fault in hash function (C)
我决定用 C 编写一个程序,该程序将接受用户输入并使用哈希 table...好吧,我遇到了障碍,我完全不知道是什么正在进行。当我 运行 我的代码一切正常,直到我给出一个输入然后我得到一个分段错误。有没有人可以指出我的错误?当用户输入时,程序将根据 ascii 中的字母总数来决定将单词放在哪里。一旦我解决了这个问题,我就会把它添加进去,这样如果发生碰撞,它就会增加 7 之类的东西,直到它找到一个可以去的地方。
#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]!='[=10=]')
{key=key+i;
i++;}
deleteFromHash(key);
}
else if(sscanf(name,"#s",&cas)==1)
{//search
i=2;
while(name[i]!='[=10=]')
{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]!='[=10=]')
{key=key+i;
i++;}
name[strlen(name) - 1] = '[=10=]';
insertToHash(key, name);
}
}
return 0;
}
您似乎从未正确初始化 i
。
此外,您在 sscanf()
格式字符串中使用 #
而不是 %
。我也不理解那些具有相同 sccanf()
调用的 else if
的逻辑,我认为那是不对的。
您似乎使用 sscanf()
而不是 strcmp()
来比较字符串?
这里
hashTable = (struct hash *)calloc(n, sizeof (struct hash));
您正在调用 calloc
但您从未初始化 n
;变量 key
也未初始化。
我决定用 C 编写一个程序,该程序将接受用户输入并使用哈希 table...好吧,我遇到了障碍,我完全不知道是什么正在进行。当我 运行 我的代码一切正常,直到我给出一个输入然后我得到一个分段错误。有没有人可以指出我的错误?当用户输入时,程序将根据 ascii 中的字母总数来决定将单词放在哪里。一旦我解决了这个问题,我就会把它添加进去,这样如果发生碰撞,它就会增加 7 之类的东西,直到它找到一个可以去的地方。
#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]!='[=10=]')
{key=key+i;
i++;}
deleteFromHash(key);
}
else if(sscanf(name,"#s",&cas)==1)
{//search
i=2;
while(name[i]!='[=10=]')
{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]!='[=10=]')
{key=key+i;
i++;}
name[strlen(name) - 1] = '[=10=]';
insertToHash(key, name);
}
}
return 0;
}
您似乎从未正确初始化 i
。
此外,您在 sscanf()
格式字符串中使用 #
而不是 %
。我也不理解那些具有相同 sccanf()
调用的 else if
的逻辑,我认为那是不对的。
您似乎使用 sscanf()
而不是 strcmp()
来比较字符串?
这里
hashTable = (struct hash *)calloc(n, sizeof (struct hash));
您正在调用 calloc
但您从未初始化 n
;变量 key
也未初始化。