Ваша add
функция malloc
sa Node
связывает ее со списком, а затем free
s выделяет Node
по некоторым причинам.Это оставит в списке висячие указатели.
Ваша функция add
также не имеет механизма добавления первого Node
в пустой список.Есть два способа сделать это.Первый способ - вернуть указатель на первый узел списка:
Node* add(Node* list, char* string1, char* string2) {
Node* temp = list;
Node* new_node = malloc(sizeof(Node));
if (!new_node) return NULL;
new_node->str1 = malloc(strlen(string1)+1);
new_node->str2 = malloc(strlen(string2)+1);
if (!new_node->str1 || !new_node->str2) {
// allocation error for one of the strings
free(new_node->str1);
free(new_node->str2);
free(new_node);
return NULL;
}
strcpy(new_node->str1, string1);
strcpy(new_node->str2, string2);
new_node->next = NULL;
if (!temp) {
new_node->prev = NULL;
list = new_node;
} else {
while (temp->next) temp = temp->next;
new_node->prev = temp;
temp->next = new_node;
}
// return pointer to first node
return list;
}
Пример вызова с использованием первого способа:
Node* mylist = NULL;
...
mylist = add(mylist, "hello", "world");
Второй способ - изменить первый параметр.на указатель на указатель на начало списка:
void add(Node** list, char* string1, char* string2) {
Node* temp = *list;
Node* new_node = malloc(sizeof(Node));
if (!new_node) return;
new_node->str1 = malloc(strlen(string1)+1);
new_node->str2 = malloc(strlen(string2)+1);
if (!new_node->str1 || !new_node->str2) {
// allocation error for one of the strings
free(new_node->str1);
free(new_node->str2);
free(new_node);
return;
}
strcpy(new_node->str1, string1);
strcpy(new_node->str2, string2);
new_node->next = NULL;
if (!temp) {
new_node->prev = NULL;
*list = new_node;
} else {
while (temp->next) temp = temp->next;
new_node->prev = temp;
temp->next = new_node;
}
}
Пример вызова с использованием второго способа:
Node* mylist = NULL;
...
add(&mylist, "hello", "world");