summaryrefslogtreecommitdiff
path: root/src/01/02a/singly_linked_list.c
diff options
context:
space:
mode:
authormo khan <mo.khan@gmail.com>2020-07-04 16:52:13 -0600
committermo khan <mo.khan@gmail.com>2020-07-04 16:52:13 -0600
commitc9575a555c0557be93e6b461c19cf5592e389d26 (patch)
tree80d7bbe9f9ac7cbba94b05516c7007d9af982522 /src/01/02a/singly_linked_list.c
parent5d6de54af0d7a4ab08b95636408a492eb8a0c57f (diff)
split singly_linked_list into separate files
Diffstat (limited to 'src/01/02a/singly_linked_list.c')
-rw-r--r--src/01/02a/singly_linked_list.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/01/02a/singly_linked_list.c b/src/01/02a/singly_linked_list.c
new file mode 100644
index 0000000..c4f3bb0
--- /dev/null
+++ b/src/01/02a/singly_linked_list.c
@@ -0,0 +1,78 @@
+#include "singly_linked_list.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+static void inspect(Node *node) {
+ if (!node) return;
+
+ printf("*******\n");
+ while (node) {
+ printf("\t%d\n", node->data);
+ node = node->next;
+ }
+ printf("*******\n");
+}
+
+Node *initialize(int data) {
+ Node *node = malloc(sizeof(Node));
+ node->data = data;
+ node->next = NULL;
+ return node;
+}
+
+Node *add(Node *head, int data) {
+ Node *tail;
+ Node *tmp = head;
+
+ while(tmp) {
+ if (!tmp->next)
+ break;
+ tmp = tmp->next;
+ }
+ tail = tmp;
+ tail->next = initialize(data);
+ return tail->next;
+}
+
+Node *get(Node *from, int index) {
+ if (!from || index < 0) return NULL;
+
+ while(index > 0 && from){
+ from = from->next;
+ index--;
+ }
+ return from;
+}
+
+static int size(Node *head) {
+ int i = 0;
+ for (Node *tmp = head; tmp && tmp != NULL; tmp = tmp->next) i++;
+ return i;
+}
+
+void swap(Node **head, int x, int y) {
+ int count = size(*head);
+
+ if (x == y) return;
+ if (x >= count) return;
+ if (y >= count) return;
+
+ Node *xp = get(*head, x - 1);
+ Node *yp = get(*head, y - 1);
+ Node *xc = get(*head, x);
+ Node *yc = get(*head, y);
+
+ if (x == 0)
+ *head = yc;
+ else
+ xp->next = yc;
+
+ if (y == 0)
+ *head = xc;
+ else
+ yp->next = xc;
+
+ Node *tmp = yc->next;
+ yc->next = xc->next;
+ xc->next = tmp;
+}