fixed some linked list shit

This commit is contained in:
Václav Šmejkal 2023-01-31 18:17:59 +01:00
parent 026f2fa458
commit 7a017b3a8c
Signed by: ENGO150
GPG Key ID: 4A57E86482968843

View File

@ -6,9 +6,10 @@
#include <why2/memory.h> #include <why2/memory.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <why2/flags.h>
//LOCAL //LOCAL
typedef struct node typedef struct node
{ {
@ -21,47 +22,54 @@ node_t *head = NULL; //TODO: Find a way to deallocate this shit at the end
void push_to_list(void *pointer) void push_to_list(void *pointer)
{ {
node_t *new_node = malloc(sizeof(node_t)); //CREATE ANOTHER ELEMENT //CREATE NODE
node_t *node_buffer_1; node_t *new_node = malloc(sizeof(node_t));
node_t *node_buffer = head;
new_node -> pointer = pointer; //ALLOCATED POINTER //ADD STUFF TO new_node
new_node -> next = NULL; //NEXT NODE new_node -> pointer = pointer;
new_node -> last = NULL; //LAST NODE new_node -> next = NULL;
new_node -> last = NULL;
if (head == NULL) //ALL MEMORY IS FREED (THERE AREN'T ANY NODES) if (head == NULL) //FIRST NODE
{ {
head = malloc(sizeof(node_t)); //INIT HEAD head = new_node;
} else //ADD AT THE END
new_node -> last = head;
head -> pointer = NULL;
head -> next = new_node; //LINK TO new_node
} else
{ {
node_buffer_1 = head; while (node_buffer -> next != NULL) node_buffer = node_buffer -> next; //GO TO THE LAST NODE
while (node_buffer_1 -> next != NULL) //GET 'LAST' NODE (next POINTER) //LINK AT THE END
{ node_buffer -> next = new_node;
node_buffer_1 = node_buffer_1 -> next; new_node -> last = node_buffer;
}
//LINK
node_buffer_1 -> next = new_node;
new_node -> last = node_buffer_1;
} }
} }
void remove_node(node_t *node) void remove_node(node_t *node)
{ {
if (head == NULL) return; //LIST IS EMPTY
//REMOVE NODE //REMOVE NODE
node -> last -> next = node -> next; //last WILL BE NEVER NULL CUZ CAN ONLY BE ANOTHER NODE OR HEAD node_t *node_buffer = head;
if (node -> next != NULL) why2_bool found = 0;
while (node_buffer -> next != NULL) //GO TROUGH THE LIST
{ {
node -> next -> last = node -> last; if (node_buffer == node) //FOUND
{
found = 1;
break;
} //TODO: Many times it isn't found
node_buffer = node_buffer -> next;
} }
if (!found) return; //node WASN'T FOUND IN THE LIST
if (node_buffer -> last != NULL) node_buffer -> last -> next = node_buffer -> next;
if (node_buffer -> next != NULL) node_buffer -> next -> last = node_buffer -> last;
//DEALLOCATION //DEALLOCATION
free(node); //TODO: Valgrind says node is still reachable, but it is deallocated here (I think) free(node);
} }
//GLOBAL //GLOBAL