C - 尝试创建哈希表时出错

时间:2015-11-11 02:55:48

标签: c linked-list hashmap hashtable

我正在处理一个在链表中存储字符串的哈希表,这样我就可以避免冲突了。但是,我收到两个错误,我不确定如何修复。我得到的第一个错误是NewT->Table[i] == NULL;行。它说warning: statement with no effects [-Wunused-value]

我得到的第二个错误是在同一个功能中。错误位于第return NewT行,错误为warning: return from incompatible pointer type[enabled by default]。我已经盯着这一段时间,我无法看到哪里有一个未使用的值,我不知道即使经过一些研究后返回错误意味着什么。有人可以向我解释这些并帮助我修复它们吗?

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

#define HASH_MULTIPLIER 65599

/*Structures*/
typedef struct List_T 
{
    char *str;
    int count;
    struct List_T *next;
} ListT;

typedef struct Hash_T
{
    int htsize;
    ListT **Table;
} HashT;

/*Prototypes*/
unsigned int hash(const char *str);
HashT **ht_create(void);

int htsize;

int main(int argc, char *argv[])
{
    if (argc <= 1)
    {
        printf("Please declare a table size");
        return 1;
    }
    htsize = atoi(argv[1]);
    return 0;
}
unsigned int hash(const char *str)
{
    int i;
    unsigned int h = 0U;

    for (i = 0; str[i] != '\0'; i++)
        h = h * HASH_MULTIPLIER + (unsigned char) str[i];

    return h % htsize;
}

HashT **ht_create(void)
{
    HashT *NewT;
    int i;

    if (htsize < 1) //invalid size for
    {
        fprintf(stderr,"Invalid Size for table");
        exit(0);
    }

    if ((NewT = malloc(sizeof(HashT))) == NULL)
    {
        fprintf(stderr,"Invalid size for table");
        exit(0);
    }

    if ((NewT->Table = malloc(sizeof(ListT *) * htsize)) == NULL)
    {
        fprintf(stderr,"Invalid size for table");
        exit(0);
    }

    for (i = 0; i<htsize; i++)
    {
        NewT->Table[i] == NULL;
    }

    NewT->htsize = htsize;

    return NewT;
}

1 个答案:

答案 0 :(得分:2)

  

我得到的第一个错误是NewT->Table[i] == NULL;行。这是warning: statement with no effects [-Wunused-value]

此错误显示是因为代码正在进行比较,而不是分配。比较返回的值(Table[i]为空?)本身没有分配给其他任何东西,这意味着它没有被使用。

保留一个=运算符而不是加倍==运算符,以确保实际分配而不是比较。

  

我得到的第二个错误是在同一个函数中。错误在于   该行返回NewT并且错误是警告:从中返回   不兼容的指针类型[默认启用]。

您的函数声称返回指向HashTHashT **指针的指针,但您最终会返回指向HashTHashT *的指针,这是NewT变量的类型。

您的函数的签名应使用单个*而不是两个。