1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
#include <stdio.h>
#include <stdlib.h>
#ifdef WIN32
#include "../os_specific/win_mem_alloc.h" /* MALLOC */
#else
#include "../os_specific/sci_mem_alloc.h" /* MALLOC */
#endif
#include "bt-int.h"
int BTI_init( struct bti_node **n )
{
*n = NULL;
return 0;
}
int BTI_add( struct bti_node **n, int value )
{
int collision = 0;
int dir = 0;
struct bti_node *p = NULL, *node = *n;
/* fprintf(stdout,"Adding %d to %p\n", value, *n);*/
while (node != NULL)
{
if (value > node->data) { p = node; dir=1; node = node->r; }
else if (value < node->data) { p = node; dir=-1; node = node->l; }
else if (value == node->data)
{
collision = 1;
break;
}
}
if (collision == 0)
{
struct bti_node *leaf;
leaf = MALLOC(sizeof(struct bti_node));
if (leaf == NULL)
{
return -1;
}
leaf->data = value;
leaf->l = leaf->r = NULL;
if (p != NULL)
{
switch (dir) {
case 1:
p->r = leaf;
break;
case -1:
p->l = leaf;
break;
}
} else {
*n = leaf;
}
}
return collision;
}
int BTI_dump( struct bti_node **n )
{
struct bti_node *node;
node = *n;
if (node->l) BTI_dump(&(node->l));
if (*n) { fprintf(stdout,"%d, ", node->data); }
if (node->r) BTI_dump(&(node->r));
return 0;
}
int BTI_done( struct bti_node **n )
{
struct bti_node *node;
if (n == NULL) return 0;
if (*n == NULL) return 0;
node = *n;
if (node->l) BTI_done(&(node->l));
if (node->r) BTI_done(&(node->r));
if (*n) { FREE(*n); *n = NULL; }
return 0;
}
|