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

时间:2017-12-30 15:14:29

标签: c hashtable chaining

我接下来的这项练习是这样做的:

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

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

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

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

谢谢

1 个答案:

答案 0 :(得分:0)

首先,

int *unici(const int *vec, size_t size, size_t *newsize)
{
    if (size == 0)
        return NULL;

    int *tmp = malloc(size * sizeof(int));

    for (size_t i = 0; i < size; i++)
    {
        tmp[i] = vec[i];
    }

    for (size_t i = 0; i < size; i++)
    {
        for (size_t j = i + 1; j < size; j++)
        {
            if (tmp[i] == tmp[j])
            {
                for (size_t k = j; k<size; k++)
                {
                    tmp[k] = tmp[k + 1];
                }
                size--;
                j--;
            }
        }
    }

    *newsize = size;
    return tmp;

}

将是

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

并且不要将指针隐藏在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; } 的类型是什么?

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

struct entry **h之间的区别是什么?

类型*h的类型为h,因此struct hashT**的类型为*h

你接下来要做什么?

  • 在启用警告的情况下编译所有代码。 struct hashT*
  • 检查gcc -Wall -Werror progname.c
  • 的返回值
  • 使用它后可以自由动态分配内存。
  • 阅读How to debug small programs.
  • 抓住book