]> 4ch.mooo.com Git - 16.git/blob - src/lib/ll.c
afb69f3f7f045193625226de2cd46dcdb0878c0e
[16.git] / src / lib / ll.c
1 #include "src/lib/ll.h"\r
2 \r
3 void print_list(node_t * head)\r
4 {\r
5         node_t * current = head;\r
6 \r
7         while (current != NULL)\r
8         {\r
9                 printf("[%u]    %d\n", current->id, current->val);\r
10                 current = current->next;\r
11         }\r
12 }\r
13 \r
14 void pushe(node_t * head, int val)\r
15 {\r
16         node_t * current = head;\r
17         current->id = head->id;\r
18         current->next->id = current->id+1;\r
19 \r
20         while (current->next != NULL)\r
21         {\r
22                 current->next->id = current->id;\r
23                 current = current->next;\r
24                 current->id++;\r
25         }\r
26 \r
27         // now we can add a new variable\r
28         current->next = malloc(sizeof(node_t));\r
29         current->next->val = val;\r
30         current->next->next = NULL;\r
31         current->next->id++;\r
32 }\r
33 \r
34 void pushs(node_t ** head, int val)\r
35 {\r
36         node_t * new_node;\r
37         new_node = malloc(sizeof(node_t));\r
38 \r
39         new_node->val = val;\r
40         new_node->next = *head;\r
41         *head = new_node;\r
42 }\r
43 \r
44 int pop(node_t ** head)\r
45 {\r
46         int retval = -1;\r
47         node_t * next_node = NULL;\r
48 \r
49         if (*head == NULL) {\r
50                 return -1;\r
51         }\r
52 \r
53         next_node = (*head)->next;\r
54         retval = (*head)->val;\r
55         free(*head);\r
56         *head = next_node;\r
57 \r
58         return retval;\r
59 }\r
60 \r
61 int remove_last(node_t * head)\r
62 {\r
63         int retval = 0;\r
64         node_t * current;\r
65 \r
66         /* if there is only one item in the list, remove it */\r
67         if (head->next == NULL) {\r
68                 retval = head->val;\r
69                 free(head);\r
70                 return retval;\r
71         }\r
72 \r
73         /* get to the last node in the list */\r
74         current = head;\r
75         while (current->next->next != NULL) {\r
76                 current = current->next;\r
77         }\r
78 \r
79         /* now current points to the last item of the list, so let's remove current->next */\r
80         retval = current->next->val;\r
81         free(current->next);\r
82         current->next = NULL;\r
83         return retval;\r
84 \r
85 }\r
86 \r
87 int remove_by_index(node_t ** head, int n)\r
88 {\r
89         int i = 0;\r
90         int retval = -1;\r
91         node_t * current = *head;\r
92         node_t * temp_node = NULL;\r
93 \r
94         if (n == 0) {\r
95                 return pop(head);\r
96         }\r
97 \r
98         for (i = 0; i < n-1; i++) {\r
99                 if (current->next == NULL) {\r
100                         return -1;\r
101                 }\r
102                 current = current->next;\r
103         }\r
104 \r
105         temp_node = current->next;\r
106         retval = temp_node->val;\r
107         current->next = temp_node->next;\r
108         free(temp_node);\r
109 \r
110         return retval;\r
111 }\r