我接下来的这项练习是这样做的:
考虑以下定义来表示具有碰撞处理链的动态哈希表。
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?什么是差异?
谢谢
答案 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
。