哈希函数中的分段错误 (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 也未初始化。