指针和结构

时间:2012-07-28 03:46:44

标签: c pointers

#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] 如何在这两个地方保存指针值?我是新手,所以请记住这一点。 :)

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

此:

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

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

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

答案 2 :(得分:0)

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

typedef struct node node;

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