散列函数中的分段错误(C)

时间:2015-02-06 10:17:02

标签: c hash struct user-input

我决定用C创建一个程序来接受用户输入并用哈希表做事......好吧我遇到了麻烦,我完全迷失了发生的事情。当我运行我的代码时,一切都很好,直到我给出一个输入,然后我得到一个分段错误。有没有人可以指出我的错误?当用户给出输入时,程序将决定将单词放在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]!='\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;
  }

2 个答案:

答案 0 :(得分:1)

下面

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

您正在呼叫calloc,但您从未初始化n;变量key都没有初始化。

答案 1 :(得分:0)

您似乎永远不会正确初始化i

此外,您在#格式字符串中使用%代替sscanf()。我也不理解那些else ifsccanf()次呼叫的逻辑,我认为没错。

您似乎只使用sscanf()代替strcmp()来比较字符串?