2011-10-28 52 views
1

我想創建一個依賴於C99中的獨立矢量數據結構的哈希表。我可以在OO的幫助下用C++來做到這一點,但我不確定如何使用結構和聯合來解決這個問題。C99中的HashTable和Vector-like數據結構

我寧願任何鏈接的例子都不包括具有高度複雜的散列函數的散列表實現。我不特別關心存儲的衝突或效率。我只想要關於如何進行的建議或者一個簡單的例子來說明相應數據結構的形式而不是功能。

回答

1

如果我正確推斷您想以完全通用的方式實現增長的哈希表,那麼您將需要很多void指針。向量是不是太硬,它只是需要大量的輸入:

typedef struct { 
    size_t capacity, nelems; 
    void **contents; 
} Vector; 

enum { INITIAL_CAPACITY = 256 }; 

Vector *make_vector() 
{ 
    Vector *v = malloc(sizeof(Vector)); 
    if (v == NULL) 
     return NULL; 
    v->capacity = INITIAL_CAPACITY; 
    v->contents = malloc(sizeof(void *) * v->capacity); 
    if (v->contents == NULL) { 
     free(v); 
     return NULL; 
    } 
    v->nelems = 0; 
    return v; 
} 

// exercise for the reader 
int vector_append(Vector *, void *); 
void *vector_at(Vector const *); 

請記住,一個通用的哈希函數將有原型size_t hash(void const *, size_t),即你需要的大小來傳遞。 (注意:你不會錯過C++的OOP特性;它是模板,他們購買的類型安全性,以及語法糖,比如操作符重載)。更多示例請參見OpenBSD的ohash庫。 )