Add rtree.h.md
This commit is contained in:
parent
4bdc4c680a
commit
f6bee0a68f
102
rtree.h.md
Normal file
102
rtree.h.md
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
# Tree example
|
||||||
|
|
||||||
|
Was written a long while ago. But it's probably ok.
|
||||||
|
|
||||||
|
## Source code:
|
||||||
|
```c
|
||||||
|
#ifndef RTREE_H
|
||||||
|
#define RTREE_H
|
||||||
|
#include "rmalloc.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
typedef struct rtree_t {
|
||||||
|
struct rtree_t *next;
|
||||||
|
struct rtree_t *children;
|
||||||
|
char c;
|
||||||
|
void *data;
|
||||||
|
} rtree_t;
|
||||||
|
|
||||||
|
rtree_t *rtree_new() {
|
||||||
|
rtree_t *b = (rtree_t *)rmalloc(sizeof(rtree_t));
|
||||||
|
b->next = NULL;
|
||||||
|
b->children = NULL;
|
||||||
|
b->c = 0;
|
||||||
|
b->data = NULL;
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
rtree_t *rtree_set(rtree_t *b, char *c, void *data) {
|
||||||
|
while (b) {
|
||||||
|
if (b->c == 0) {
|
||||||
|
b->c = *c;
|
||||||
|
c++;
|
||||||
|
if (*c == 0) {
|
||||||
|
b->data = data;
|
||||||
|
// printf("SET1 %c\n", b->c);
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
} else if (b->c == *c) {
|
||||||
|
c++;
|
||||||
|
if (*c == 0) {
|
||||||
|
b->data = data;
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
if (b->children) {
|
||||||
|
b = b->children;
|
||||||
|
} else {
|
||||||
|
b->children = rtree_new();
|
||||||
|
b = b->children;
|
||||||
|
}
|
||||||
|
} else if (b->next) {
|
||||||
|
b = b->next;
|
||||||
|
} else {
|
||||||
|
b->next = rtree_new();
|
||||||
|
b = b->next;
|
||||||
|
b->c = *c;
|
||||||
|
c++;
|
||||||
|
if (*c == 0) {
|
||||||
|
b->data = data;
|
||||||
|
return b;
|
||||||
|
} else {
|
||||||
|
b->children = rtree_new();
|
||||||
|
b = b->children;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
rtree_t *rtree_find(rtree_t *b, char *c) {
|
||||||
|
while (b) {
|
||||||
|
if (b->c == *c) {
|
||||||
|
c++;
|
||||||
|
if (*c == 0) {
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
b = b->children;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
b = b->next;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rtree_free(rtree_t *b) {
|
||||||
|
if (!b)
|
||||||
|
return;
|
||||||
|
rtree_free(b->children);
|
||||||
|
rtree_free(b->next);
|
||||||
|
rfree(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *rtree_get(rtree_t *b, char *c) {
|
||||||
|
rtree_t *t = rtree_find(b, c);
|
||||||
|
if (t) {
|
||||||
|
return t->data;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
Loading…
Reference in New Issue
Block a user