数组指针中的所有值在函数调用时都会被修改

问题描述 投票:0回答:1

所以,我有这个基于链表数据结构的哈希表数据结构:

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

老实说,我真的不明白这里发生了什么(我猜测这与剩余指针值有关?)任何帮助将不胜感激。预先感谢。

arrays c list pointers hashtable
1个回答
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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.