插入哈希表

时间:2014-10-18 18:06:56

标签: c hash

我想在哈希表中插入一个整数。要做到这一点,我要创建一个节点数组*,并尝试使listarray[i]->data=5之类的作业成为可能。但是,我仍然对指针感到困惑,而且我在评论中遇到了崩溃' //崩溃在这里'而且我不明白为什么。我在main()中的初始化是否无效?

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

    typedef struct node
      {
      int data;
      struct node * next;
      } node;

    //------------------------------------------------------------------------------
    void insert (node **listarray, int size)
     {

     node *temp;
     int value = 11; //just some random value for now, eventually will be scanned in
     int index = value % size; // 11 modulo 8 yields 3

     printf ("index is %d\n", index); //prints 3 fine

     if (listarray[index] == NULL)
       {
       printf("listarray[%d] is NULL",index); //prints because of loop in main
       listarray[index]->data = value; //crashes here
       printf("listarray[%d] is now %d",index,listarray[index]->data); //never prints
       listarray[index]->next = NULL;
       }

     else
       {
       temp->next = listarray[index];
       listarray[index] = temp;
       listarray[index]->data = value;
       }
     }//end insert()



//------------------------------------------------------------------------------
    int main()
      {
    int size = 8,i; //set default to 8

     node * head=NULL; //head of the list
     node **listarray = malloc (sizeof (node*) * size); //declare an array of Node *
                                          //do i need double pointers here?

          for (i = 0; i < size; i++)    //malloc each array position
          {
            listarray[i] = malloc (sizeof (node) * size);
            listarray[i] = NULL; //satisfies the first condition in insert();
          }

          insert(*&listarray,size);
      }

输出:

    index is 3
    listarray[3] is NULL

(崩溃)

期望的输出:

index is 3
listarray[3] is NULL
listarray[3] is now 11

1 个答案:

答案 0 :(得分:1)

这里有各种各样的问题:

如果您有某个size的哈希表,则哈希码必须映射到0size - 1之间的值。您的默认大小为8,但您的哈希码为x % 13,这意味着您的索引可能超出范围。

你的insert函数也应该将项目传递给insert(除非那是名为size的参数,在这种情况下它被严重错误命名)。

 if (listarray[index] == NULL) {
     listarray[index]->data = value; //crashes here
     listarray[index]->next = NULL;
 }

毫无疑问它会崩溃:当节点为NULL时,您无法使用*->取消引用它。你应该在这里分配新的内存。

你不应该在这里分配内存:

      for (i = 0; i < size; i++)    //malloc each array position
      {
        listarray[i] = malloc (sizeof (node) * size);
        listarray[i] = NULL; //satisfies the first condition in insert();
      }

分配内存然后将其重置为NULL是无稽之谈。 NULL是一个特殊值,表示没有内存位于指向的位置。只需将所有节点设置为NULL,这意味着哈希表开始时没有任何节点。当您需要某个位置的节点时分配。

else子句中,您写道:

 else
   {
   temp->next = listarray[index];
   listarray[index] = temp;
   listarray[index]->data = value;
   }

但尚未分配temp,但您取消引用它。这和解除引用'NULL`一样糟糕。

您的哈希表还需要一种处理冲突的方法。看起来好像在哈希表中的每个索引处都有一个链表。这是处理它的好方法,但你还没有正确实现它。

你似乎有理解指针的问题。也许你应该从一个更简单的数据结构开始,比如链接列表,只是为了练习?掌握了这些知识后,您可以使用所学知识来实现​​哈希表。