我正在处理实现哈希表。我对哈希表的理解是,有一个像表一样的数组,你可以通过获取哈希值并按表大小修改它来快速访问元素。所以我最初的想法是宣布
Node *hTable [100];
哪里
typedef struct node {
char *s;
int value;
} Node;
并转到数组的索引和malloc属于那里的新元素。但是,问题是我需要增长我的桌子。
所以,我的问题是,我将如何创建一个动态表,但像数组一样访问它? (例如table[i]
)。
我知道你需要打电话
Node *table = (Node*)malloc(sizeof(Node)*size);
它允许你像表table[i] =...
一样访问它,但如果我这样做,我不能在表的索引中声明一个新的Node
table[i]=(Node*)malloc(sizeof(Node));
这是我一直在测试的代码(获取seg错误),以便更好地查看问题:
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 typedef struct node {
5 int data;
6 struct node *next;
7 } Node;
8
9
10 void main() {
11 Node **list;
12 *list = (Node*)malloc(sizeof(Node)*10);
13 for (int i = 0; i < 10; i++) {
14 list[i] = (Node*)malloc(sizeof(Node)); //problem here?
15 list[i]->data = i;
16 list[i]->next = NULL;
17 }
18 printf("printing...\n");
19 for (int i = 0; i < 10; i++) {
20 printf("%d ", list[i]->data);
21 }
22 }
你的问题是如何为list
分配空间。 list
未初始化且未指向有效内存,您必须先为其分配空间,然后为每个元素分配空间:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
} Node;
int main() //return type of main is int
{
Node **list;
list = malloc(10 * sizeof *list); //allocate memory for list not *list, also no need to cast return value of malloc.
for (int i = 0; i < 10; i++)
{
list[i] = malloc(sizeof *list[i]); //allocate space for each element.
list[i]->data = i;
list[i]->next = NULL;
}
printf("printing...\n");
for (int i = 0; i < 10; i++)
{
printf("%d ", list[i]->data);
}
return 0;
}
它不需要是一个指针数组,您可以简单地创建一个节点数组,其中:
Node *list = malloc(sizeof *list * count);
然后你可以访问list[i].s
和list[i].value
。
当你想要增长表时,你使用realloc()
:
new_list = realloc(list, sizeof *list * new_count);
if (new_list) {
list = new_list;
} else {
// report allocation failure
}
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} Node;
int main() {
// just initialize it this way ( previous was undefined behavior, dereferencing an initialize pointer)
Node **list= malloc(sizeof(Node*)*10);
for (int i = 0; i < 10; i++) {
list[i] = malloc(sizeof(Node*)); //problem here?
list[i]->data = i;
list[i]->next = NULL;
}
printf("printing...\n");
for (int i = 0; i < 10; i++) {
printf("%d ", list[i]->data);
}
}