-2

我目前正在尝试创建一个字符串哈希表。但是,在我的搜索功能中,我遇到了一个错误:请求成员_在不是结构或联合的东西中......再次

 /*search hash table*/
    ListC search(hash_ref h, char* key){
        ListC* tempList;
        int hashvalue= hashing(h, key);
46      for(tempList= h->List[hashvalue]; tempList!=NULL; tempList=tempList->next){
47          if(strcmp(tempList->key,key)==0){
                return tempList;
            }
        }
        return NULL;
    }

    /*hash function*/
    int hashing(hash_ref h, char* key){
        int hashvalue=0;
        for(hashvalue=0;key!='\0';key++){
            hashvalue= *key + (hashvalue*5) - hashvalue;
        }
        return hashvalue%h->size;
    }

    /*HashTable struct*/
    typedef struct HashTable{
    int size;
    ListC **List;   
    }hash;

    typedef struct Node{
        long key;/*book id*/
        long count;
        struct Node* next;
        struct Node* prev;
    }NodeType;

    typedef NodeType* NodeRef;

    typedef struct ListCount{
        NodeRef first;
        NodeRef last;
        NodeRef current;
        long length;
    }ListCount;

ListC 在我的头文件中定义为

typedef struct ListCount* ListC;

在第 46 行和第 47 行,我收到一条错误消息,指出 key 和 next 是不是结构的成员。我不确定这里有什么问题

4

3 回答 3

2
typedef struct ListCount* ListC;

ListC指针类型也是如此。

ListC* tempList;

tempList是指向 a 的指针的指针ListCount

... tempList=tempList->next ...

tempList不指向具有名为 的成员的结构next

我建议这说明为什么typedef为指针类型定义 a 通常是一个坏主意。无论如何,您必须跟踪间接级别;如果所有指针类型都是显式的,那么这样做通常会更容易。

于 2013-05-20T03:11:33.937 回答
1
typedef struct ListCount *ListC;

这条线可能不是你的意思。

  • ListC==struct ListCount *
  • ListC *==struct ListCount **
ListC *foo = whatever;
foo->next;

相当于

struct ListCount *foo = *whatever;
foo.next;

这当然是不正确的。

尽量不要定义不会使其明显是指针 typedef 的指针 typedef。例如,typedef struct ListCount *ListCPtr如果你真的需要,你可以;或者只是typedef struct ListCount ListC,这就是我认为你想要的。

于 2013-05-20T03:15:04.603 回答
0

ListC 是一个指向直接指向结构 Listcount.so 的指针的指针,*LiatC 没有成员 next 或 key。
检查您的 typedef 定义。

于 2013-05-20T06:23:54.383 回答