/* * Copyright (c) 2001 Fenris, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* Tree_Node* root = NULL; * unsigned int key; * int value; * * set(&root, key, value); * value = get(&root, key); * * free_tree(&root); */ #include "globals.h" #include "tree.h" void set_root(Tree_Node** root, unsigned int key, int value) { Tree_Node * item; if ((item = (Tree_Node *)malloc(sizeof(Tree_Node))) == NULL) die("malloc"); item->left = item->right = NULL; item->key = key; item->value = value; insert_item(root, item); return; } void insert_item(Tree_Node **tree, Tree_Node *item) { if (*tree == NULL) { *tree = item; return; } if (item->key < (*tree)->key) { insert_item(&(*tree)->left, item); } else if (item->key > (*tree)->key) { insert_item(&(*tree)->right, item); } else { (*tree)->value = item->value; free(item); } return; } int get_node(Tree_Node **tree, unsigned int key) { if (*tree == NULL) { return 0; } if (key < (*tree)->key) { return get_node(&(*tree)->left, key); } else if (key > (*tree)->key) { return get_node(&(*tree)->right, key); } else { return (*tree)->value; } } void clean_tree(Tree_Node **tree) { if ((*tree) == NULL) { return; } if ((*tree)->left != NULL) { clean_tree(&(*tree)->left); } free((*tree)->left); if ((*tree)->right != NULL) { clean_tree(&(*tree)->right); } free((*tree)->right); return; }