【发布时间】:2015-02-24 06:05:22
【问题描述】:
为了简化未来学校作业的开发,我决定为我常用的两种数据结构(链表和哈希表)创建一个 API(你会这么称呼它吗?)。
在开发其中的每一个时,我最终得到了以下两个插入函数:
int list_insert(list *l, char *data, unsigned int idx);
int hash_insert(hash_table **ht, char *data);
list_insert() 函数(以及所有列表函数)最终成为按值传递,因为除非我正在 malloc'ing 或 free'ing 它,否则我不需要直接修改 list * 本身。但是,因为我想在我的哈希表中包含自动重新哈希,我发现我必须在任何可能强制重新哈希的函数中通过引用而不是按值传递表。现在我得到如下语法:
list_insert(l, "foo", 3);
hash_insert(&ht, "foo");
这种差异让我觉得有点奇怪,我发现自己想知道是否应该将列表函数也更改为按引用传递以保持一致性——即使我的任何函数都不需要利用它。这里的典型共识是什么?如果我的函数确实需要修改它的参数,我应该只通过引用传递,还是为了一致性而应该通过引用传递?
结构定义:
typedef struct list_node list_node;
struct list_node {
char *data;
list_node *next;
list_node *prev;
};
typedef struct list list;
struct list {
list_node *head;
list_node *tail;
size_t size;
};
typedef struct hash_table hash_table;
struct hash_table {
list **table;
size_t entries;
size_t buckets;
float maxLoad;
unsigned int (*hash)(char*, unsigned int);
};
列出函数:
list *list_createList();
list_node *list_createNode();
void list_destroyList(list *l);
void list_destroyNode(list_node *n);
int list_append(list *l, char *data);
int list_insert(list *l, char *data, unsigned int idx);
int list_remove(list *l, char *data, int (*compar)(const void*, const void*));
void list_push(list *l, char *data);
char *list_pop(list *l);
int list_count(list *l, char *data, int (*compar)(const void*, const void*));
int list_reverse(list *l);
int list_sort(list *l, int (*compar)(const void*, const void*));
int list_print(list *l, void (*print)(char *data));
哈希函数:
hash_table *hash_createTable(size_t buckets, float maxLoad, unsigned int (*hash)(char*, unsigned int));
void hash_destroyTable(hash_table *ht);
list *hash_list(const hash_table **ht);
int hash_checkLoad(hash_table **ht);
int hash_rehash(hash_table **ht);
int hash_insert(hash_table **ht, char *data);
void hash_stats(hash_table *ht);
int hash_print(hash_table *ht, void (*print)(char*));
【问题讨论】:
-
hash_table分别有什么信息。list包含?也许修改通过引用传递的list*与修改hash_table*一样有意义... -
您能否告诉我们您的 API 到底是做什么的以及您的结构是什么样的?
-
建议Code Review 而不是这里。
-
为什么要在堆上分配根?只需按创建值返回它(如果您坚持使用
{0}进行聚合初始化不会削减它),并始终通过引用传递它,您将获得两者相似的 API。 -
@gopi 我添加了结构和函数原型。我认为它们是相对不言自明的,但如果需要更多信息,我很乐意提供。
标签: c styles pass-by-reference pass-by-value