#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 10
// A hashtable is a mixture of a linked list and array
typedef struct node NODE;
struct node{
int value;
NODE* next;
};
int hash(int);
void insert(int,NODE **);
int main(){
NODE* hashtable[SIZE];
insert(12,&hashtable[SIZE]);
printf("%d\n",hashtable[5]->value);
}
int hash(int data){
return data%7;
}
void insert(int value,NODE **table){
int loc = hash(value);
NODE* temp = malloc(sizeof(NODE));
temp->next = NULL;
temp->value = value;
*table[loc] = *temp;
printf("%d\n",table[loc]->value);
}
以上代码打印: 12和 27475674(随机数可能是位置。)
如何让它打印12和12,即如何在阵列中进行更改。我想用数组[5]填充为存储值而创建的节点的位置。
答案 0 :(得分:3)
表达式*table[loc]
等于*(table[loc])
,这可能不是您想要的,因为那时您将取消引用未初始化的指针。
然后,分配将*temp
的内容复制到一些看似随机的内存中。
然后丢弃刚刚分配的内存导致内存泄漏。
也没有尝试制作哈希桶的链表。
尝试使用初始化在hashtable
函数中初始创建main
数组,以生成指向NULL
的所有指针:
NODE* hashtable[SIZE] = { NULL }; // Will initialize all elements to NULL
然后在插入节点时,实际将其链接到bucket-list:
temp->next = table[loc];
table[loc] = temp;
答案 1 :(得分:0)
这只是我对你的程序做的一个简单的改变,它会告诉你你实际上做错了什么。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 10
// A hashtable is a mixture of a linked list and array
typedef struct node NODE;
struct node {
int value;
NODE* next;
};
NODE *hashtable[SIZE] = { NULL };
int hash(int);
int insert(int); //, NODE **);
int main(void)
{
int loc = insert(12); //, &hashtable[SIZE]);
if (loc < SIZE) {
if (hashtable[loc]) {
printf("%d\n", hashtable[loc]->value);
} else {
printf("err: invalid pointer received\n");
}
}
return 0;
}
int hash(int data)
{
return data%7;
}
int insert(int value) //, NODE *table[])
{
int loc = hash(value);
printf("loc = %d\n", loc);
if (loc < SIZE) {
NODE *temp = (NODE *) malloc(sizeof(NODE));
temp->value = value;
temp->next = NULL;
hashtable[loc] = temp;
printf("%d\n", hashtable[loc]->value);
}
return loc;
}
这里我已经全局声明了哈希表,以确保您尝试更新的值对于这两个函数都是可见的。这就是代码中的问题。无论你为temp分配什么新地址都有地址'x',但是你试图从你的main函数访问无效地址。我只想给你一些提示。希望这对你有所帮助。享受!