Skip to content
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
140 changes: 140 additions & 0 deletions C/Linked-List/Easy List Node algorithms
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
#include <stdio.h>
#include <stdlib.h>

typedef struct s_node {
int value;
struct s_node* next;
} ListNode;

ListNode* get(int index, ListNode* node) {
if (node == nullptr || index < 0) {
return nullptr;
}

if (index == 0) {
return node;
}

return get(--index, node->next);
}

void set(ListNode* node, int index, int value) {
if (node == nullptr || index < 0) {
return;
}

if (index == 0) {
node->value = value;
return;
}

set(node->next, --index, value);
}

void insert_top(ListNode** list, ListNode* node) {
node->next = *list;
*list = node;
}

void insert_bottom(ListNode* list, ListNode* node) {
if (list->next == nullptr) {
list->next = node;
return;
}

insert_bottom(list->next, node);
}

void insert_rec(ListNode* currentNode, ListNode* node, int index) {
if (currentNode == nullptr) {
return;
}

if (index - 1 == 0) {
node->next = currentNode->next;
currentNode->next = node;
return;
}

insert_rec(currentNode->next, node, --index);
}

void insert_to_list(ListNode** list, ListNode* node, const int index) {
if (index < 0)
return;

if (index == 0) {
insert_top(list, node);
return;
}

insert_rec(*list, node, index);
}

void remove_top(ListNode** list) {
ListNode* tempNode = *list;
*list = (*list)->next;
free(tempNode);
}

void remove_bottom(ListNode* node) {
if (node->next->next == nullptr) {
ListNode* tempNode = node->next;
node->next = nullptr;
free(tempNode);
return;
}

remove_bottom(node->next);
}

void remove_rec(ListNode* currentNode, int index) {
if (index - 1 == 0) {
ListNode* tempNode = currentNode->next;
currentNode->next = tempNode->next;
free(tempNode);
return;
}

remove_rec(currentNode->next, --index);
}

void remove_from_list(ListNode** list, const int index) {
if (index < 0) {
return;
}

if (index == 0) {
remove_top(list);
return;
}

remove_rec(*list, index);
}

ListNode* create_list(const int value) {
ListNode* node = malloc(sizeof(ListNode));
node->value = value;
node->next = nullptr;
return node;
}

int main(void) {
ListNode* list = create_list(1);
ListNode* n2 = create_list(2);
ListNode* n3 = create_list(3);
ListNode* n4 = create_list(4);
ListNode* n5 = create_list(5);

insert_to_list(&list, n2, 1);
insert_to_list(&list, n3, 2);
insert_to_list(&list, n4, 3);
insert_to_list(&list, n5, 4);

free(list);
free(n2);
free(n3);
free(n4);
free(n5);
return 0;
}
Loading