-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlinked_list.c
More file actions
107 lines (97 loc) · 2.12 KB
/
linked_list.c
File metadata and controls
107 lines (97 loc) · 2.12 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
102
103
104
105
106
107
// File: linked_list.c
// Include this file *after* including <stdlib.h>
typedef struct linked_list
{
struct linked_list * prev;
struct linked_list * next;
int val;
}
linked_list;
linked_list * ll_new(int init_val)
{
linked_list * itr = malloc(sizeof(linked_list));
itr->prev = NULL;
itr->next = NULL;
itr->val = init_val;
return itr;
}
void ll_delete(linked_list * itr)
{
if (itr == NULL) return;
while (itr->prev != NULL) itr = itr->prev;
while (itr->next != NULL)
{
itr = itr->next;
free(itr->prev);
}
free(itr);
}
void ll_free(linked_list * itr)
{
if (itr == NULL) return;
while (itr->next != NULL) itr = itr->next;
while (itr->prev != NULL)
{
itr = itr->prev;
free(itr->next);
}
free(itr);
}
linked_list * ll_prev(linked_list * itr)
{
if (itr != NULL && itr->prev != NULL) return itr->prev;
else return itr;
}
linked_list * ll_next(linked_list * itr)
{
if (itr != NULL && itr->next != NULL) return itr->next;
else return itr;
}
void ll_push_prev(linked_list * itr, int init_val)
{
if (itr == NULL) return;
linked_list * temp = itr->prev;
itr->prev = ll_new(init_val);
itr->prev->next = itr;
if (temp != NULL)
{
temp->next = itr->prev;
itr->prev->prev = temp;
}
}
void ll_push_next(linked_list * itr, int init_val)
{
if (itr == NULL) return;
linked_list * temp = itr->next;
itr->next = ll_new(init_val);
itr->next->prev = itr;
if (temp != NULL)
{
temp->prev = itr->next;
itr->next->next = temp;
}
}
void ll_pop_prev(linked_list * itr)
{
if (itr == NULL || itr->prev == NULL) return;
linked_list * temp = itr->prev->prev;
free(itr->prev);
itr->prev = temp;
if (temp != NULL) temp->next = itr;
}
void ll_pop_next(linked_list * itr)
{
if (itr == NULL || itr->next == NULL) return;
linked_list * temp = itr->next->next;
free(itr->next);
itr->next = temp;
if (temp != NULL) temp->prev = itr;
}
int ll_length(linked_list * itr)
{
if (itr == NULL) return 0;
int length = 1;
for (linked_list * l = itr->prev; l != NULL; l = l->prev) length++;
for (linked_list * r = itr->next; r != NULL; r = r->next) length++;
return length;
}