mirror of
https://github.com/DarkFlippers/unleashed-firmware
synced 2024-12-22 18:53:18 +00:00
136 lines
2.6 KiB
C
136 lines
2.6 KiB
C
#include "list.h"
|
|
|
|
ListNode* list_init_head(void* data) {
|
|
ListNode* new = malloc(sizeof(ListNode));
|
|
if(new == NULL) return NULL;
|
|
new->data = data;
|
|
new->next = NULL;
|
|
return new;
|
|
}
|
|
|
|
ListNode* list_add(ListNode* head, void* data) {
|
|
ListNode* new = malloc(sizeof(ListNode));
|
|
if(new == NULL) return NULL;
|
|
new->data = data;
|
|
new->next = NULL;
|
|
|
|
if(head == NULL)
|
|
head = new;
|
|
else {
|
|
ListNode* it;
|
|
|
|
for(it = head; it->next != NULL; it = it->next)
|
|
;
|
|
|
|
it->next = new;
|
|
}
|
|
|
|
return head;
|
|
}
|
|
|
|
ListNode* list_find(ListNode* head, const void* data) {
|
|
ListNode* it = NULL;
|
|
|
|
for(it = head; it != NULL; it = it->next)
|
|
if(it->data == data) break;
|
|
|
|
return it;
|
|
}
|
|
|
|
ListNode* list_element_at(ListNode* head, uint16_t index) {
|
|
ListNode* it;
|
|
uint16_t i;
|
|
for(it = head, i = 0; it != NULL && i < index; it = it->next, i++)
|
|
;
|
|
return it;
|
|
}
|
|
|
|
ListNode* list_remove(ListNode* head, ListNode* ep) {
|
|
if(head == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
if(head == ep) {
|
|
ListNode* new_head = head->next;
|
|
free(head);
|
|
return new_head;
|
|
}
|
|
|
|
ListNode* it;
|
|
|
|
for(it = head; it->next != ep; it = it->next)
|
|
;
|
|
|
|
it->next = ep->next;
|
|
free(ep);
|
|
|
|
return head;
|
|
}
|
|
|
|
ListNode* list_remove_at(ListNode* head, uint16_t index, void** removed_node_data) {
|
|
if(head == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
ListNode* it;
|
|
ListNode* prev = NULL;
|
|
|
|
uint16_t i;
|
|
|
|
for(it = head, i = 0; it != NULL && i < index; prev = it, it = it->next, i++)
|
|
;
|
|
|
|
if(it == NULL) return head;
|
|
|
|
ListNode* new_head = head;
|
|
if(prev == NULL) {
|
|
new_head = it->next;
|
|
} else {
|
|
prev->next = it->next;
|
|
}
|
|
|
|
if(removed_node_data != NULL) {
|
|
*removed_node_data = it->data;
|
|
}
|
|
|
|
free(it);
|
|
|
|
return new_head;
|
|
}
|
|
|
|
ListNode* list_insert_at(ListNode* head, uint16_t index, void* data) {
|
|
if(index == 0 || head == NULL) {
|
|
ListNode* new_head = list_init_head(data);
|
|
if(new_head != NULL) {
|
|
new_head->next = head;
|
|
}
|
|
return new_head;
|
|
}
|
|
|
|
ListNode* it;
|
|
ListNode* prev = NULL;
|
|
|
|
uint16_t i;
|
|
|
|
for(it = head, i = 0; it != NULL && i < index; prev = it, it = it->next, i++)
|
|
;
|
|
|
|
ListNode* new = malloc(sizeof(ListNode));
|
|
if(new == NULL) return NULL;
|
|
new->data = data;
|
|
new->next = it;
|
|
prev->next = new;
|
|
|
|
return head;
|
|
}
|
|
|
|
void list_free(ListNode* head) {
|
|
ListNode* it = head;
|
|
ListNode* tmp;
|
|
|
|
while(it != NULL) {
|
|
tmp = it;
|
|
it = it->next;
|
|
free(tmp);
|
|
}
|
|
}
|