+link_t* list_insert(link_t* head, unsigned index, int value) {
+
+ if (index == 0) {
+ return list_prepend(head, value);
+ } else if (index == list_count(head)) {
+ return list_append(head, value);
+ } else {
+ link_t* link_insrt = list_new(value);
+ link_t* head_first = head;
+ link_t* head_next = NULL;
+ for (unsigned i = 0; i < index-1; i++) {
+ head = head->next;
+ }
+ head_next = head->next;
+ head->next = link_insrt;
+ head = link_insrt;
+ head->next = head_next;
+ return head_first;
+ }
+}
+
+link_t* list_delete(link_t* head, unsigned index) {
+ link_t* head_prev = NULL;
+ link_t* head_next = NULL;
+ link_t* head_ret = NULL;
+
+ if (head == NULL) {
+ return NULL;
+ } else if (index == 0) {
+ head_next = head->next;
+ free(head);
+ head = head_next;
+ head_ret = head;
+ } else {
+ link_t* head_first = head;
+ for (unsigned i = 0; i < index-1; i++) {
+ head = head->next;
+ }
+ head_prev = head;
+ head = head->next;
+ head_next = head->next;
+ free(head);
+ head = head_prev;
+ head->next = head_next;
+ head_ret = head_first;
+ }
+ if (head_ret != NULL) {
+ return head_ret;
+ } else {
+ return NULL;
+ }
+}
+
+link_t* list_concat(link_t* first, link_t* second) {
+ link_t* head_first = first;
+
+ while (first->next != NULL) {
+ first = first->next;
+ }
+ first->next = second;
+ return head_first;
+}
+
+link_t* list_sort(link_t* head) {
+ int tmp;
+ bool isswaped;
+ link_t* head_first = head;
+
+ do {
+ isswaped = false;
+ while (head->next != NULL) {
+ if (head->value > head->next->value) {
+ tmp = head->value;
+ head->value = head->next->value;
+ head->next->value = tmp;
+ isswaped = true;
+ }
+ head = head->next;
+ }
+ /* Reloop at the beginning of the list until there's values swaped */
+ head = head_first;
+ } while (isswaped);
+ return head_first;
+}
+
+static link_t* _list_merge_sort(link_t* head1, link_t* head2) {
+ link_t* head_result = NULL;
+
+ if (head1 == NULL) {
+ return head2;
+ }
+ if (head2 == NULL) {
+ return head1;
+ }
+ if (head1->value < head2->value) {
+ head_result = head1;
+ head_result->next = _list_merge_sort(head1->next, head2);
+ } else {
+ head_result = head2;
+ head_result->next = _list_merge_sort(head1, head2->next);
+ }
+ return head_result;
+}
+
+link_t* list_merge_sort(link_t* head) {
+ link_t* head1;
+ link_t* head2;
+
+ if (head == NULL || head->next == NULL) {
+ return head;
+ }
+
+ head1 = head;
+ head2 = head->next;
+ while (head2 != NULL && head2->next != NULL) {
+ head = head->next;
+ head2 = head->next->next;
+ }
+ head2 = head->next;
+ head->next = NULL;
+
+ head1 = list_merge_sort(head1);
+ head2 = list_merge_sort(head2);
+ return _list_merge_sort(head1, head2);
+}
+