在C中编译哈希表实现时出错

时间:2018-04-05 18:51:11

标签: c linked-list hashtable

我有一个包含约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;
    }
}

1 个答案:

答案 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]