2D_Engine_Casio/src/linked_list.c

131 lines
2.6 KiB
C

#include "linked_list.h"
#include "malloc.h"
void linked_list_init(linked_list_t *linked_list, const size_t data_size)
{
linked_list->data_size = data_size;
linked_list->first = NULL;
linked_list->last = NULL;
}
elem_t *elem_create(linked_list_t *linked_list)
{
elem_t *elem;
elem = malloc(sizeof(elem_t));
if(!elem) return NULL;
elem->data = malloc(linked_list->data_size);
if(!elem->data)
{
free(elem);
return NULL;
}
return elem;
}
void linked_list_push_back(linked_list_t *linked_list, elem_t *elem)
{
if(!elem) return;
elem->prev = linked_list->last;
elem->next = NULL;
if(linked_list->last)
linked_list->last->next = elem;
else
linked_list->first = elem;
linked_list->last = elem;
}
void linked_list_push_front(linked_list_t *linked_list, elem_t *elem)
{
if(!elem) return;
elem->next = linked_list->first;
elem->prev = NULL;
if(linked_list->first)
linked_list->first->prev = elem;
else
linked_list->last = elem;
linked_list->first = elem;
}
void linked_list_pop_back(linked_list_t *linked_list)
{
elem_t *tmp = linked_list->last;
if(!tmp) return;
linked_list->last = tmp->prev;
if(linked_list->last)
linked_list->last->next = NULL;
else
linked_list->first = NULL;
free(tmp->data);
free(tmp);
}
void linked_list_pop_front(linked_list_t *linked_list)
{
elem_t *tmp = linked_list->first;
if(!tmp) return;
linked_list->first = tmp->next;
if(linked_list->first)
linked_list->first->prev = NULL;
else
linked_list->last = NULL;
free(tmp->data);
free(tmp);
}
size_t linked_list_get_size(linked_list_t *linked_list)
{
elem_t *actual_elem = linked_list->first;
if(!actual_elem) return 0;
size_t size = 0;
while(actual_elem)
{
actual_elem = actual_elem->next;
size++;
}
return size;
}
bool linked_list_is_empty(linked_list_t *linked_list)
{
return !linked_list->first;
}
bool linked_list_is_in_bound(linked_list_t *linked_list, size_t index)
{
return index < linked_list_get_size(linked_list);
}
elem_t *linked_list_get_elem(linked_list_t *linked_list, size_t index)
{
if(!linked_list_is_in_bound(linked_list, index)) return NULL;
elem_t *actual_elem = linked_list->first;
if(!actual_elem) return NULL;
for (size_t i = 0; i < index; i++)
{
actual_elem = actual_elem->next;
}
return actual_elem;
}
/*
void linked_list_insert(linked_list_t *linked_list, elem_t *elem, size_t index)
{
}*/