Предыдущие вставки в массив связанного списка заменяются самой последней вставкой

#c #struct #linked-list

#c #структура #связанный список

Вопрос:

Я пытаюсь создать массив связанного списка, в котором хранятся имена в расположении индекса, заданном хэш-значением имени.

По какой-то причине все предыдущие вставки заменяются самой последней вставкой.

 struct Node{
    char *key;
    struct Node *next;
};

struct Table{
    struct Node **entrypoint;
};
  
 void InsertData(struct Table* table, const char *const name){

    //char dest[100];

    //strncpy(dest, name, 50);

    int hashIndex = HashVal(name);

    printf("Index Value is %dn", hashIndex);


    struct Node *new_node;

    new_node = (struct Node* )malloc(sizeof(struct Node));
    new_node->key = (char *)malloc((strlen(name) 1)*sizeof(char));

    if(table->entrypoint[hashIndex] == 0){ 
        table->entrypoint[hashIndex] = new_node;
        strcpy(new_node->key, name);
        new_node->next = NULL;
    }

    else{
        struct Node *cursor = table->entrypoint[hashIndex];
        while(cursor->next  != NULL)
            cursor = cursor->next;

    cursor->next = new_node;
        strcpy(new_node->key, name);
        new_node->next = NULL;
    }


    //DISPLAY LIST
    //int count = 0;
    struct Node *temp;

    for(int i = 0; i < 15; i  ){

        if(table->entrypoint[i] == NULL)
            printf("%d: n", i);
        else{
            temp = table->entrypoint[i];
            printf("%d: ", i);
            printf("%s ", temp->key);
            //count = 0;

                         while(temp->next != NULL){
                printf("%s ", temp->key);
                temp = temp->next;
                count  ;
            }
            //printf("No. of times ran: %d", count);
            printf("n");
        }
    }

}

  

Количество созданных узлов и их положение в связанном списке работают нормально.

Но все вставки заменяются окончательной вставкой

Ожидаемый результат:

 InsertData(amp;table, "Jeffrey Lars");
InsertData(amp;table, "Neal Rhine");
InsertData(amp;table, "Ledley King");

Table:
0: 
1: 
2: 
3: Jeffrey Lars, Ledley King
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14: Neal Rhine
  

Фактический результат:

 InsertData(amp;table, "Jeffrey Lars");
InsertData(amp;table, "Neal Rhine");
InsertData(amp;table, "Ledley King");

Table:
0: 
1: 
2: 
3: Ledley King, Ledley King
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14: Ledley King
  

Не мог бы кто-нибудь, пожалуйста, указать, что я делаю неправильно. Спасибо

Комментарии:

1. хуже того; при InsertData возврате добавленный вами узел имеет указатель на строковые данные, которые официально висят . То есть он использовался для указания на действительные данные, но при возврате буфер, на который dest ссылается, больше не действителен, и ваша программа вызовет UB, если попытается использовать эти указатели. Я думаю, что больше времени на лучшее понимание динамического управления памятью и того, как работают указатели в C, вероятно, должно быть в меню.

2. Я избавился от dest . И используется strcpy(new_node->key, name) после выделения памяти для new_node-> key с использованием new_node->key = (char *)malloc((strlen(name) 1)*sizeof(char)); . Похоже, что проблема по-прежнему та же, что и раньше

3. Где ваш код для выделения памяти для точки входа?