diff options
| author | mo khan <mo.khan@gmail.com> | 2020-07-04 16:52:13 -0600 |
|---|---|---|
| committer | mo khan <mo.khan@gmail.com> | 2020-07-04 16:52:13 -0600 |
| commit | c9575a555c0557be93e6b461c19cf5592e389d26 (patch) | |
| tree | 80d7bbe9f9ac7cbba94b05516c7007d9af982522 /src/01/02a/singly_linked_list.c | |
| parent | 5d6de54af0d7a4ab08b95636408a492eb8a0c57f (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.c | 78 |
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; +} |
