Basically I want to be able to free memory of a linked list (which also contains a linked list), so that the user can enter their own custom values to create a new linked list. I also want my print function to no longer find these values in memory once they have been freed, so maybe the condition (while list_ptr != NULL) is not the correct condition to use while printing? I have the two following structs:
typedef struct item
{
char name[125];
struct item *next;
} Item;
typedef struct list
{
char name[125];
struct list *next;
struct list *prev;
Item *first_item;
} List;
I used them to create a linked list using the following function, which loads my default list:
void load_default(List **board)
{
List *list1 = malloc(sizeof(List));
strcpy(list1->name, "Abey:");
list1->next = NULL;
Item *item1_1 = malloc(sizeof(Item));
strcpy(item1_1->name, "Oculus Pro");
Item *item1_2 = malloc(sizeof(Item));
strcpy(item1_2->name, "Oculus Quest 1");
item1_2->next = NULL;
list1->first_item = item1_1;
item1_1->next = item1_2;
List *list2 = malloc(sizeof(List));
strcpy(list2->name, "Dante:");
list2->next = list1;
Item *item2_1 = malloc(sizeof(Item));
strcpy(item2_1->name, "Oculus Quest 1");
item2_1->next = NULL;
Item *item2_2 = malloc(sizeof(Item));
strcpy(item2_2->name, "3070 RTX");
item2_2->next = NULL;
list2->first_item = item2_1;
item2_1->next = item2_2;
List *list3 = malloc(sizeof(List));
strcpy(list3->name, "Tim:");
list3->next = list2;
Item *item3_1 = malloc(sizeof(Item));
strcpy(item3_1->name, "Oculus Quest 2");
list3->first_item = item3_1;
item3_1->next = NULL;
List *list4 = malloc(sizeof(List));
strcpy(list4->name, "Nick:");
Item *item4_1 = malloc(sizeof(Item));
strcpy(item4_1->name, "3070 RTX");
item4_1->next = NULL;
list4->first_item = item4_1;
list4->next = list3;
list1->prev = list2;
list2->prev = list3;
list3->prev = list4;
list4->prev = NULL;
*board = list4;
}
I also have a print function:
void print_list(List *list)
{
List *list_ptr = list;
while (list_ptr != NULL)
{
printf("%s\n", list_ptr->name);
Item *item = list_ptr->first_item;
while (item != NULL)
{
printf("\t%s\n", item);
item = item->next;
}
list_ptr = list_ptr->next;
}
printf("Press any key to continue...\n");
getch();
system("cls");
}
I tried to create a function to free memory but it did not work as expected:
void free_lists(List *list)
{
List *list_ptr = list;
Item *item;
while (list_ptr != NULL)
{
item = list_ptr->first_item;
while (item != NULL)
{
Item *temp = item;
free(item);
item = temp->next;
}
List *templis = list_ptr;
free(list_ptr);
list_ptr = templis->next;
}
}
While it did free up some bits, I was left with the following:
p8w
p♫w
p8w
p8w
p8w
p8w
3070 RTX
p8w
p8w
Oculus Quest 1
when i called the print function. Somehow my print function is still finding all the elements, but finding garbage values, or the original values, in those parts of memory.
In these lines,
while (item != NULL)
{
Item *temp = item;
free(item);
item = temp->next;
}
temp
points to item
by you have previously destroyed whatever item
was pointing to.
Instead, it should point to item->next
.
while (item != NULL)
{
Item *temp = item->next;
free(item);
item = temp;
}
Same goes for the outer loop.
Aside, code will also benefit from an insert
function.