我想在哈希表中插入一个整数。要做到这一点,我要创建一个节点数组*,并尝试使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
答案 0 :(得分:1)
这里有各种各样的问题:
如果您有某个size
的哈希表,则哈希码必须映射到0
和size - 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`一样糟糕。
您的哈希表还需要一种处理冲突的方法。看起来好像在哈希表中的每个索引处都有一个链表。这是处理它的好方法,但你还没有正确实现它。
你似乎有理解指针的问题。也许你应该从一个更简单的数据结构开始,比如链接列表,只是为了练习?掌握了这些知识后,您可以使用所学知识来实现哈希表。