我有一个包含约600万条记录(键值对)的文件,我试图将其存储在哈希表中。但是,我正在第一个栅栏落下。该程序将无法编译,我甚至还没有尝试阅读记录。
首先,在尝试初始化整个数组时,我收到以下错误:
31: error: incompatible types when assigning to type ‘struct node’ from type ‘void *’
也许我应该让我的struct node中的所有内容都等于null?但是数组位置是否等于null并不是更好吗?
另外,在我的insert函数中,当检查数组位置是否为null时,我收到此错误:
invalid type argument of unary ‘*’ (have ‘struct node’)
如何检查阵列位置是否为空?该错误来自第63,65,69,71,76行
我在这里阅读了很多帖子(包括Why whole structure can not be compared in C, yet it can be copied?),但无法编译我的代码。如果这是基本的东西,请道歉。
我到目前为止的完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HASH_SIZE 1000000
struct node{
unsigned long long key;
float value;
struct node *next;
};
struct node *ebv_hash = NULL;
unsigned long long hash(unsigned long long);
void insert(unsigned long long, float);
int main(int argc, char *argv[]){
FILE *ebv_fp;
ebv_fp=fopen(argv[1], "r");
ebv_hash = malloc(HASH_SIZE * sizeof(struct node));
for(unsigned long long a=0; a <=HASH_SIZE; a++){
*ebv_hash[a]=NULL;
}
/* Code to read in data I have not written yet */
fclose(ebv_fp);
free(ebv_hash);
return 0;
}
unsigned long long hash(unsigned long long ani_id){
return (ani_id % HASH_SIZE);
}
void insert(unsigned long long nkey, float nvalue){
struct node *nani = malloc(sizeof(struct node));
unsigned long long hash_ind;
nani->key=nkey;
nani->value=nvalue;
nani->next=NULL;
hash_ind = hash(nkey);
if(ebv_hash[hash_ind] == NULL){
ebv_hash[hash_ind] = nani;
}else{
struct node *p = malloc(sizeof(struct node));
p = ebv_hash[hash_ind];
while(p->next != NULL){
p = p->next;
}
p->next = nani;
}
}
答案 0 :(得分:1)
你已宣布
struct node* ebv_hash = NULL;
并使用
ebv_hash = malloc(HASH_SIZE * sizeof(struct node));
这意味着您将获得一个struct node
数组。
我认为你想要的是一个指向struct node
的指针数组。这看起来像这样:
struct node** ebv_hash = NULL;
ebv_hash = malloc(HASH_SIZE * sizeof(struct node*));
for(int i=0;i<HASH_SIZE;i++)
ebv_hash[i] = NULL;
然后,当您需要一个节点i
时,您自己malloc
一个并设置相应的ebv_hash[i]
。