mirror of
https://github.com/sloven-c/linked_list.git
synced 2025-10-30 12:17:23 +01:00
Init commit
This commit is contained in:
6
CMakeLists.txt
Normal file
6
CMakeLists.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
cmake_minimum_required(VERSION 4.0)
|
||||||
|
project(linked_list C)
|
||||||
|
|
||||||
|
set(CMAKE_C_STANDARD 23)
|
||||||
|
|
||||||
|
add_executable(linked_list main.c)
|
||||||
106
main.c
Normal file
106
main.c
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
struct List {
|
||||||
|
struct List *prev, *next;
|
||||||
|
int value;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct List *init(int value);
|
||||||
|
|
||||||
|
void add(struct List *list, int value);
|
||||||
|
|
||||||
|
void rem(struct List **list, int value_to_remove);
|
||||||
|
|
||||||
|
void print_list(const struct List *list);
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
struct List *seznam = init(1);
|
||||||
|
add(seznam, 5);
|
||||||
|
add(seznam, 2);
|
||||||
|
print_list(seznam);
|
||||||
|
|
||||||
|
rem(&seznam, 1);
|
||||||
|
print_list(seznam);
|
||||||
|
|
||||||
|
rem(&seznam, 2);
|
||||||
|
print_list(seznam);
|
||||||
|
|
||||||
|
rem(&seznam, 5);
|
||||||
|
print_list(seznam);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct List *init(const int value) {
|
||||||
|
struct List *list = malloc(sizeof(struct List));
|
||||||
|
list->next = nullptr;
|
||||||
|
list->prev = nullptr;
|
||||||
|
list->value = value;
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
void add(struct List *list, const int value) {
|
||||||
|
while (list->next != NULL) {
|
||||||
|
list = list->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct List *alloc_list = init(value);
|
||||||
|
alloc_list->next = nullptr;
|
||||||
|
alloc_list->prev = list;
|
||||||
|
alloc_list->value = value;
|
||||||
|
|
||||||
|
list->next = alloc_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rem(struct List **list, const int value_to_remove) {
|
||||||
|
struct List *first = *list;
|
||||||
|
// we need in case first element (which caller holds is destroyed), or there are no more elements (the list is destroyed)
|
||||||
|
struct List *it = *list;
|
||||||
|
struct List *next;
|
||||||
|
|
||||||
|
for (; it != NULL; it = next) {
|
||||||
|
next = it->next;
|
||||||
|
if (it->value != value_to_remove) continue;
|
||||||
|
|
||||||
|
// we have to remove this element
|
||||||
|
const bool has_prev = it->prev != NULL;
|
||||||
|
const bool has_next = it->next != NULL;
|
||||||
|
|
||||||
|
if (has_prev) {
|
||||||
|
// we have an element to the left
|
||||||
|
if (has_next) {
|
||||||
|
// we have an element to the right
|
||||||
|
it->prev->next = it->next;
|
||||||
|
it->next->prev = it->prev;
|
||||||
|
} else {
|
||||||
|
// we don't have an element to the right
|
||||||
|
it->prev->next = nullptr;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// we don't have an element to the left
|
||||||
|
// we can surmise this is the first element and caller will crash if they don't have the correct element
|
||||||
|
if (has_next) {
|
||||||
|
it->next->prev = nullptr;
|
||||||
|
first = it->next;
|
||||||
|
} else {
|
||||||
|
first = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// free the memory taken by current element
|
||||||
|
free(it);
|
||||||
|
}
|
||||||
|
|
||||||
|
*list = first;
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_list(const struct List *list) {
|
||||||
|
if (list == NULL) printf("Empty list");
|
||||||
|
|
||||||
|
for (; list != NULL; list = list->next) {
|
||||||
|
printf("%d ", list->value);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user