#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. Где ваш код для выделения памяти для точки входа?