From e04525e6f7802be30481477b272e39c55230db83 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sun, 20 Sep 2026 10:41:37 +0200 Subject: initial import --- main.c | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 main.c (limited to 'main.c') diff --git a/main.c b/main.c new file mode 100644 index 0000000..a176f89 --- /dev/null +++ b/main.c @@ -0,0 +1,141 @@ +// Standard C +#include +#include +#include + +// RB-Implementierung +#include + +// clang-format off +struct address { + char name[41]; + int age; + + RB_ENTRY(address) links; +}; +// clang-format on + +// type: struct address_tree { ... }; +RB_HEAD(address_tree, address); + +int +address_compare(const struct address *lhs, const struct address *rhs) +{ + int res; + + if ( (res = strcmp(lhs->name, rhs->name)) != 0 ) + return res; + + return (lhs->age < rhs->age) ? -1 : (lhs->age > rhs->age); +} + +void +address_init(struct address *address, const char *name, int age) +{ + strlcpy(address->name, name, sizeof(address->name)); + address->age = age; +} + +struct address * +address_new(const char *name, int age) +{ + struct address *address; + + if ( (address = malloc(sizeof *address)) != NULL ) { + address_init(address, name, age); + } + return address; +} + +// Prototypen +RB_PROTOTYPE_STATIC(address_tree, address, links, address_compare) + +// Implemtierungen +RB_GENERATE_STATIC(address_tree, address, links, address_compare) + +void +insert(struct address_tree *addresses, struct address *address) +{ + RB_INSERT(address_tree, addresses, address); +} + +void +iterate(struct address_tree *addresses) +{ + struct address *ptr; + for ( ptr = RB_MIN(address_tree, addresses); + ptr != NULL; + ptr = RB_NEXT(address_tree, addresses, ptr) ) { + printf("%s\n", ptr->name); + } +} + +void +iterate2(struct address_tree *addresses) +{ + struct address *ptr; + RB_FOREACH(ptr, address_tree, addresses) + { + printf("%s\n", ptr->name); + } +} + +struct address * +search(struct address_tree *addresses, const char *name, int age) +{ + struct address key; + + address_init(&key, name, age); + + return RB_FIND(address_tree, addresses, &key); +} + +void +delete_one(struct address_tree *addresses, struct address *address) +{ + if ( address != NULL ) { + RB_REMOVE(address_tree, addresses, address); + free(address); + } +} + +void +delete_all(struct address_tree *addresses) +{ + struct address *ptr; + while ( (ptr = RB_MIN(address_tree, addresses)) != NULL ) { + RB_REMOVE(address_tree, addresses, ptr); + free(ptr); + } +} + +int +main(void) +{ + struct address_tree addresses = RB_INITIALIZER(&addresses); + + // struct address_tree addresses; + // RB_INIT(&addresses); + + insert(&addresses, address_new("Thomas", 44)); + insert(&addresses, address_new("Markus", 44)); + insert(&addresses, address_new("Miriam", 44)); + insert(&addresses, address_new("Albert", 44)); + + iterate(&addresses); + + struct address *ptr_miriam = search(&addresses, "Miriam", 44); + + if ( ptr_miriam != NULL ) + printf("Gefunden: %s (%d)\n", ptr_miriam->name, ptr_miriam->age); + else + printf("Nicht gefunden\n"); + + delete_one(&addresses, ptr_miriam); + + iterate2(&addresses); + + delete_all(&addresses); + + return EXIT_SUCCESS; +} -- cgit v1.3