C语言 初始化新的哈希表,指针问题



我有这个家庭作业练习如下:

请考虑以下定义来表示具有冲突处理链接的动态哈希表。

typedef struct entry{
char key[10];
void *info;
struct entry *next;
}   *Entry;
typedef struct hashT{
int hashsize;
Entry *table;
}   *HashTable;

定义 'HashTable newTable(int hashsize) 请注意,必须分配必要的内存,并且必须使用空列表初始化所有表条目。

我的主张是这样的:

HashTable newTable(int hashSize){
Entry *table = malloc(sizeof((struct entry)*hashSize));
HashTable *h = malloc(sizeof(struct hashT));
h->hashSize = hashSize;
h->table = table;
return h;
}

我很确定逻辑是正确的。 我的问题是指针。 例如,有时我看到 (字符 *),或者在这种情况下 (表 *) 在 malloc 函数之前......这有必要吗?

对于退货,我应该返回 h 还是 *h? 有什么区别?

谢谢

首先,

Entry *table = malloc(sizeof((struct entry)*hashSize));

将是

Entry table = malloc(sizeof(struct entry)*hashSize);
^^^    
Look at the parentheses here.

您还将在此处进行相同的更改,

HashTable h = malloc(sizeof(struct hashT));

HashTable也是如此。你忘记了你已经把指针藏在了不应该typedef里面。

通过上述更改,代码将是

HashTable newTable(int hashSize){
Entry table = malloc(sizeof(struct entry)*hashSize);
HashTable h = malloc(sizeof(struct hashT));
h->hashSize = hashSize;
h->table = table;
return h;
}

并且不要将指针隐藏在typedef后面。(希望我能用红色写这个,但是是的,这将使您免于许多问题)。

Entry*的类型是什么?

它属于struct entry **型。在您的情况下,您在分配时不需要它。如果你这样做,那将是矫枉过正。

h*h有什么区别?

从类型上讲,h属于struct hashT**型,因此*h将是struct hashT*型。

你接下来该怎么做?

  • 在启用警告的情况下编译所有代码。gcc -Wall -Werror progname.c
  • 检查malloc的返回值。
  • 使用完后释放动态分配的内存。
  • 阅读如何调试小程序。
  • 拿一本书。

最新更新