所以,我有这个基于链表数据结构的哈希表数据结构:
//hashtable
struct hashTable{
linkedList* cells;
int capacity;
};
typedef struct hashTable hashTable;
//linked list node
struct node{
char* symbol;
int weight;
struct node* succ;
};
typedef struct node node;
//linked list
struct linkedList{
node* head;
};
typedef struct linkedList linkedList;
我正在尝试为哈希表实现插入函数。目前,该函数(及其调用的函数insertion_linkedList)的代码如下:
//linked list insertion
void insertion_linkedList(linkedList* l, node n){
node** p = &l->head;
if (*p == NULL){
*p = &n;
}
else{
while ((*p)->succ != NULL){
*p = (*p)->succ;
}
}
(*p)->succ = &n;
return;
}
//hashtable insertion
void insertion_hashTable(hashTable h, char* s, int n){
node ins = {.symbol = s, .weight = n, .succ = NULL};
insertion_linkedList(&h.cells[hashFunction(s, h.capacity)], ins);
}
由于某种我不明白的原因,每当我尝试将新节点插入哈希表数据结构时,所有先前插入的值也会被修改为与最近添加的节点相对应的值。参见:
int main(){
int cap = 100;
hashTable h = creation_hashTable(cap);
insertion_hashTable(h,"b",4);
insertion_hashTable(h,"a",1);
insertion_hashTable(h, "c", 2);
printf("%i\n", h.cells[hashFunction("b",h.capacity)].head->weight);
// !! returns 2 and not 4 !!
exit(0);
}
老实说,我真的不明白这里发生了什么(我猜测这与剩余指针值有关?)任何帮助将不胜感激。预先感谢。
在
(*p)->succ = &n;
&n
是指向局部变量(函数参数)的指针 - 具有自动存储持续时间的对象。
为了让您的链表以任何有意义的方式扩展,您需要使用动态内存分配来延长您放置在列表/表中的对象的生命周期。
一个粗略的例子是:
void insertion_linkedList(linkedList *l, node n)
{
node *new = malloc(sizeof *new);
/* byte-wise copy of `n` to the memory pointed at by `new` */
*new = n;
if (!l->head)
l->head = new;
else {
node *current = l->head;
while (current->succ)
current = current->succ;
current->succ = new;
}
}