69 lines
2.2 KiB
C
69 lines
2.2 KiB
C
#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);
|
|
}
|