1
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "dictionary.h"

#define HASH_SIZE 100

// prototype
int hash(char *word);

// counter
int counter;

// node
typedef struct
{
    char *word;
    node *next;
} node;

// hash table
node *hashtable[HASH_SIZE];

bool
load(const char *dictionary)
{
    // open the dictionary
    FILE *dict = fopen(dictionary, "r");
    if(dict == NULL)
    {
        printf("Could not open %s.\n", dictionary);
        return false;
    }

    // set all values in the hash table to null
    for(int i = 0; i < HASH_SIZE; i++)
    {
        hashtable[i] = NULL;
    }

    // set the counter to 0
    counter = 0;

    // iterate through the words in the dictionary
    while (!feof(dict))
    {
        // get word into a string
        char gotcha[LENGTH];
        fscanf(dict, "%s", gotcha);

        // declare a node and allocate memory
        node n;
        n.word = malloc( strlen(gotcha)*sizeof(char) );

        // save the word into the node
        strcpy(n.word, gotcha);

        // hash the word, baby!
        int hash_value = hash(n.word);

        // start saving addresses to the hashtable
        n.next = hashtable[hash_value];
        hashtable[hash_value] = &n;

        //test
        int len = strlen(n.word);
        printf("%s\n", n.word);
        printf("%i\n", len);

        // that's one more!
        counter++;
    }


    fclose(dict);

    return true;
}

我在这两行代码中收到以下两个错误:

    n.next = hashtable[hash_value];
    hashtable[hash_value] = &n;

dictionary.c:89:16:错误:来自不兼容指针类型的赋值[-Werror] dictionary.c:90:31:错误:来自不兼容指针类型的赋值[-Werror] 如何在这两个地方保存指针值?我是新手,所以请记住这一点。:)

4

3 回答 3

2

在您的结构中,类型节点尚未定义。将其更改为使用结构标记:

typedef struct node
{
    char *word;
    struct node *next;
} node;
于 2012-07-28T04:20:42.773 回答
0

这:

typedef struct
{
    char *word;
    node *next;
} node;

是语法错误。发生在作为类型node *next;创建的 typedef 结束之前。node如果您的编译器出于某种原因接受了这一点,它可能认为现在有两种不同的类型称为“节点”,这就解释了为什么其中一种与另一种不兼容。你应该放弃那种 typedef 的愚蠢(结构通常不应该被 typedef'ed ),而只是使用

struct node
{
    char *word;
    struct node *next;
};
于 2012-07-28T04:22:16.180 回答
0

在定义结构之前定义结构的 typedef 名称。这允许相互引用结构而不考虑顺序,并且不需要不一致的定义,有时使用 struct 关键字,有时没有它。请注意,在 C++ 中,您可以完全取消 typedef 行:

typedef struct node node;

struct node
{
    char* word;
    node* next;
};
于 2012-07-28T04:57:17.487 回答