LinkedList new functions and fixes

This commit is contained in:
2023-03-15 05:52:33 +06:00
parent 6c6c4fff8b
commit a200f2c965
4 changed files with 81 additions and 36 deletions

View File

@@ -1,3 +1,68 @@
#include "LinkedList.h"
LinkedList_define(Pointer, true)
void LinkedList_addToBeginning(void* _llist, void* _new_node) {
LinkedList(Pointer)* llist=_llist;
LLNode(Pointer)* new_node=_new_node;
llist->count++;
if(llist->last_node==NULL){
if(llist->first_node!=NULL)
throw(ERR_NULLPTR); // last_node can't be null if first_node != null
llist->last_node=new_node;
}
else {
llist->first_node->prev=new_node;
new_node->next=llist->first_node;
}
llist->first_node=new_node;
}
void LinkedList_addToEnd(void* _llist, void* _new_node) {
LinkedList(Pointer)* llist=_llist;
LLNode(Pointer)* new_node=_new_node;
llist->count++;
if(llist->first_node==NULL) {
if(llist->last_node!=NULL)
throw(ERR_NULLPTR); // first_node can't be null if last_node != null
llist->first_node=new_node;
}
else {
llist->last_node->next=new_node;
new_node->prev=llist->last_node;
}
llist->last_node=new_node;
}
static inline void _insertNode(LinkedList(Pointer)* llist,
LLNode(Pointer)* prev_node, LLNode(Pointer)* new_node, LLNode(Pointer)* next_node){
if(prev_node==NULL){
if(next_node==llist->first_node)
LinkedList_addToBeginning(llist, new_node);
else throw(ERR_NULLPTR); // prev_node is null, but it isn't insertion before first_node
}
else if(next_node==NULL){
if(prev_node==llist->last_node)
LinkedList_addToEnd(llist, new_node);
else throw(ERR_NULLPTR); // next_node is null, but it isn't insertion after last_node
}
else {
prev_node->next=new_node;
new_node->prev=prev_node;
new_node->next=next_node;
next_node->prev=new_node;
llist->count++;
}
}
void LinkedList_insertPrev(void* _llist, void* _new_node, void* _next_node){
LLNode(Pointer)* next_node=_next_node;
LLNode(Pointer)* prev_node=next_node->prev;
_insertNode(_llist, prev_node, _new_node, next_node);
}
void LinkedList_insertNext(void* _llist, void* _new_node, void* _prev_node){
LLNode(Pointer)* prev_node=_prev_node;
LLNode(Pointer)* next_node=prev_node->next;
_insertNode(_llist, prev_node, _new_node, next_node);
}