Simple linked list structure

This commit is contained in:
Samuel Ortion 2025-03-01 09:43:36 +01:00
parent 522deb6f82
commit 2726e1ec76
Signed by: sortion
GPG Key ID: 9B02406F8C4FB765
2 changed files with 138 additions and 0 deletions

56
include/list.h Normal file
View File

@ -0,0 +1,56 @@
#pragma once
#include <stdio.h>
#include <stdlib.h>
/** Linked list data structure
*/
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode *list_create(int val) {
struct ListNode *node = malloc(sizeof(struct ListNode));
node->next = NULL;
node->val = val;
return node;
}
struct ListNode *list_insert(struct ListNode *list, int val) {
if (list == NULL) {
list = list_create(val);
return list;
} else {
struct ListNode *tail = list_create(val);
struct ListNode *current = list;
while (current->next != NULL) {
current = current->next;
}
current->next = tail;
return list;
}
}
void list_clear(struct ListNode *list) {
struct ListNode *current = list;
if (current == NULL) {
return;
}
while (current->next != NULL) {
struct ListNode *next = current->next;
free(current);
current = next;
}
}
void list_print(struct ListNode *list) {
struct ListNode *current = list;
printf("list: ");
while (current != NULL) {
printf("%d->", current->val);
current = current->next;
}
printf("\n");
}

View File

@ -0,0 +1,82 @@
#include "../include/list.h"
/** Remove n-th element from linked list */
struct ListNode *removeNthElement(struct ListNode *head, int n) {
int i=0;
if (n < 0) {
return head;
}
if (n == 0) {
return head->next;
}
struct ListNode *current = head;
while (i < n - 1 && current != NULL) {
current = current->next;
i++;
}
if (current != NULL && current->next != NULL && current->next->next != NULL) {
struct ListNode *to_remove = current->next;
current->next = current->next->next;
free(to_remove);
} else if (current != NULL && current->next != NULL) {
free(current->next);
current->next = NULL;
}
return head;
}
/** Length of a linked list */
unsigned int list_length(struct ListNode *head) {
unsigned int length = 0;
struct ListNode *current = head;
while (current != NULL) {
current = current->next;
length++;
}
return length;
}
struct ListNode *removeNthFromEnd(struct ListNode *head, int n) {
if (n < 0) {
return head;
}
unsigned int length = list_length(head);
return removeNthElement(head, length - n);
}
void test_1() {
struct ListNode *l = NULL;
l = list_insert(l, 1);
l = list_insert(l, 2);
l = list_insert(l, 3);
l = list_insert(l, 4);
l = list_insert(l, 5);
struct ListNode *result_list = removeNthFromEnd(l, 2);
list_print(result_list);
list_clear(result_list);
}
void test_2() {
struct ListNode *l = NULL;
l = list_insert(l, 1);
struct ListNode *result_list = removeNthFromEnd(l, 1);
list_print(result_list);
list_clear(result_list);
}
void test_3() {
struct ListNode *l = NULL;
l = list_insert(l, 1);
l = list_insert(l, 2);
struct ListNode *result_list = removeNthFromEnd(l, 1);
list_print(result_list);
list_clear(result_list);
}
int main() {
test_1();
test_2();
test_3();
}