-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdoubly_linked_list.c
More file actions
101 lines (91 loc) · 2.84 KB
/
doubly_linked_list.c
File metadata and controls
101 lines (91 loc) · 2.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "doubly_linked_list.h"
DoublyLinkedList* create_DoublyLinkedList() {
DoublyLinkedList *p = malloc(sizeof(DoublyLinkedList));
p->head = NULL;
p->tail = NULL;
return p;
}
static bool isEmpty_DoublyLinkedList(DoublyLinkedList* list) {
return list->head == NULL;
}
void insertAtBeginning_DoublyLinkedList(DoublyLinkedList** list, int value){
DoublyLinkedNode *newNode;
newNode = malloc(sizeof(DoublyLinkedNode));
newNode->item = value;
newNode->next = (*list)->head;
newNode->prev = NULL;
if (isEmpty_DoublyLinkedList(*list)) {
(*list)->tail = newNode;
}
(*list)->head = newNode;
}
void insertAtEnd_DoublyLinkedList(DoublyLinkedList** list, int value) {
DoublyLinkedNode *newNode;
newNode = malloc(sizeof(DoublyLinkedNode));
newNode->item = value;
newNode->next = NULL;
newNode->prev = (*list)->tail;
if (isEmpty_DoublyLinkedList(*list)) {
(*list)->head = newNode;
}
(*list)->tail = newNode;
}
void insertBefore_DoublyLinkedList(DoublyLinkedList** list, DoublyLinkedNode** node, int value) {
DoublyLinkedNode *newNode;
newNode = malloc(sizeof(DoublyLinkedNode));
newNode->item = value;
newNode->next = *node;
newNode->prev = (*node)->prev;
(*node)->prev = newNode;
if (newNode->prev != NULL) {
newNode->prev->next = newNode;
} else {
(*list)->head = newNode;
}
}
void insertAfter_DoublyLinkedList(DoublyLinkedList** list, DoublyLinkedNode** node, int value) {
DoublyLinkedNode *newNode;
newNode = malloc(sizeof(DoublyLinkedNode));
newNode->item = value;
newNode->next = (*node)->next;
newNode->prev = *node;
(*node)->next = newNode;
if (newNode->next != NULL) {
newNode->prev->next = newNode;
} else {
(*list)->tail = newNode;
}
}
void remove_DoublyLinkedList(DoublyLinkedList** list, DoublyLinkedNode** node) {
// We are deleting head..
if ((*node) == (*list)->head) {
(*list)->head = (*node)->next;
}
// We are deleting tail..
if ((*node) == (*list)->tail) {
(*list)->tail = (*node)->prev;
}
if ((*node)->next != NULL) {
(*node)->next->prev = (*node)->prev;
}
if ((*node)->prev != NULL) {
(*node)->prev->next = (*node)->next;
}
free(node);
return;
}
static void traverseForward_DoublyLinkedListIter(DoublyLinkedNode** node, void (*callback)(int item)) {
callback((*node)->item);
if ((*node)->next != NULL ){
return traverseForward_DoublyLinkedListIter(&(*node)->next, callback);
}
}
void traverseForward_DoublyLinkedList(DoublyLinkedList** list, void (*callback)(int item)) {
if ((*list)->head != NULL ){
return traverseForward_DoublyLinkedListIter(&(*list)->head, callback);
}
}