初始化新的哈希表,指针问题[关闭]

问题描述 投票:-2回答:1

我有以下作业的练习:

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

typedef struct entry{
   char key[10];
   void *info;
   struct entry *next;
}   *Entry;

typedef struct hashT{
   int hashsize;
   Entry *table;
}   *HashTable;

定义`HashTable newTable(int hashsize)注意必须分配必要的memmory,并且必须用空列表初始化所有表。

我的主张是这样的:

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;
}

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

对于返回,我应该返回h,还是* h?什么是差异?

谢谢

c hashtable chaining
1个回答
0
投票

首先,

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后面。(希望我能用红色写这个但是这样可以避免许多问题)。

What is the type of Entry*?

它是struct entry **类型。在你的情况下,你在分配时不需要它。如果你这样做,那就太过分了。

What is the difference between h and *h?

类型h类型为struct hashT**,所以*h将是struct hashT*类型。

What shall you do next?

  • 编译所有代码并启用警告。 gcc -Wall -Werror progname.c
  • 检查malloc的返回值。
  • 使用它后,可以自由动态分配内存。
  • 阅读How to debug small programs.
  • 抓住book
© www.soinside.com 2019 - 2024. All rights reserved.