From ad1457beb2b61fc918e4be616a9679e30729bbd4 Mon Sep 17 00:00:00 2001 From: Tom Ryder Date: Mon, 28 Mar 2016 16:36:01 +1300 Subject: Tinkering with simple binary trees Trying to keep the code nice and terse. strcmp(3) usage here possibly unsafe. --- .gitignore | 2 ++ Makefile | 9 +++++++++ btree-int.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ btree-str.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 btree-int.c create mode 100644 btree-str.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fcb13a2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +btree-int +btree-str diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ec2658d --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +.PHONY: all clean + +CC = clang +CFLAGS = -std=c90 -Weverything + +all : btree-int btree-str + +clean : + rm -f btree-int btree-str diff --git a/btree-int.c b/btree-int.c new file mode 100644 index 0000000..8935760 --- /dev/null +++ b/btree-int.c @@ -0,0 +1,53 @@ +#include +#include + +typedef struct Node { + long v; + struct Node *l; + struct Node *r; +} Node; + +void an(Node **, Node *); +void pn(Node *); + +void an(Node **r, Node *n) { + if (!*r) { + *r = n; + return; + } + if (n->v > (*r)->v) { + an(&((*r)->r), n); + } else { + an(&((*r)->l), n); + } + return; +} + +void pn(Node *n) { + if (!n) { + return; + } + if (n->l) { + pn(n->l); + } + fprintf(stdout, "%ld\n", n->v); + if (n->r) { + pn(n->r); + } + return; +} + +int main(int argc, char **argv) { + Node *r = NULL; + + for (argv++, argc--; argc; argv++, argc--) { + Node *n = malloc(sizeof(Node)); + n->v = atoi(*argv); + n->l = n->r = NULL; + an(&r, n); + } + + pn(r); + + exit(EXIT_SUCCESS); +} diff --git a/btree-str.c b/btree-str.c new file mode 100644 index 0000000..3f080a4 --- /dev/null +++ b/btree-str.c @@ -0,0 +1,54 @@ +#include +#include +#include + +typedef struct Node { + char *v; + struct Node *l; + struct Node *r; +} Node; + +void an(Node **, Node *); +void pn(Node *); + +void an(Node **r, Node *n) { + if (!*r) { + *r = n; + return; + } + if (strcmp(n->v, (*r)->v) > 0) { + an(&((*r)->r), n); + } else { + an(&((*r)->l), n); + } + return; +} + +void pn(Node *n) { + if (!n) { + return; + } + if (n->l) { + pn(n->l); + } + fprintf(stdout, "%s\n", n->v); + if (n->r) { + pn(n->r); + } + return; +} + +int main(int argc, char **argv) { + Node *r = NULL; + + for (argv++, argc--; argc; argv++, argc--) { + Node *n = malloc(sizeof(Node)); + n->v = *argv; + n->l = n->r = NULL; + an(&r, n); + } + + pn(r); + + exit(EXIT_SUCCESS); +} -- cgit v1.2.3