tree/treedemo.h :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: /********************************************************************* * FILE: treedemo.h * AUTHOR: Mike McCarthy * HARVARD ID: 00161118 * DATE: June 2003 * PURPOSE: header file for treedemo.c *********************************************************************/ #define BUFSIZE 512 #define SMBUFSIZE 255 FILE* setup(char*); void fatal(char*, char*); [END: tree/treedemo.h]========================================================== ================================================================================ ================================================================================ tree/treedemo.c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: /********************************************************************* * FILE: treedemo.c * AUTHOR: Mike McCarthy * HARVARD ID: 00161118 * DATE: June 2003 * PURPOSE: Demo of dynamic binary tree data structure. * * NOTES: Uses a simple struct containing a char* and int. * * Reads from filename supplied as command line arg. * * USAGE: At the command line, type: treedemo data * *********************************************************************/ #include #include #include #include "treedemo.h" #include "tree.h" extern node* root; int main(int argc, char* argv[]) { char buf[BUFSIZE], string[SMBUFSIZE], value[SMBUFSIZE]; node* new_node; FILE* fp = NULL; if(argc != 2) fatal("incorrect number of arguments", ""); fp = setup(argv[1]); printf("\n"); while(fgets(buf, BUFSIZE, fp) != NULL){ if(sscanf(buf, "%s%s", string, value) != 2) fatal("file is corrupt", ""); if((new_node = get_node(string)) == NULL) fatal("memory failure", ""); set_node(new_node, string, value); printf("inserting: %s %d\n", new_node->str, new_node->num); root = insert(root, new_node); printf("\tTREE CONTAINS: "); traverse(root); printf("\n"); } fclose(fp); root = delete_tree(root); printf("\nAfter deletion, tree contains: "); traverse(root); printf("\n\n"); return 0; } /********************************************************************/ FILE* setup(char* fname) { FILE* fp; fp = fopen(fname, "r"); if(!fp){ perror(fname); exit(1); } init_tree(); return fp; } /********************************************************************/ void fatal(char* s1, char* s2) { fprintf(stderr, "Error: %s %s\n", s1, s2); exit(1); } /********************************************************************/ [END: tree/treedemo.c]========================================================== ================================================================================ ================================================================================ tree/tree.h :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: /********************************************************************* * FILE: tree.h * AUTHOR: Mike McCarthy * HARVARD ID: 00161118 * DATE: June 2003 * PURPOSE: header file for tree.c *********************************************************************/ struct node{ char* str; int num; struct node* left; struct node* right; }; typedef struct node node; void init_tree(); node* get_node(char*); void set_node(node*, char*, char*); node* insert(node*, node*); void traverse(node*); node* delete_tree(node*); [END: tree/tree.h]============================================================== ================================================================================ ================================================================================ tree/tree.c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: /********************************************************************* * FILE: tree.c * AUTHOR: Mike McCarthy * HARVARD ID: 00161118 * DATE: June 2003 * PURPOSE: Implentation file for binary tree functions *********************************************************************/ #include #include #include #include "treedemo.h" #include "tree.h" node* root; /********************************************************************/ void init_tree() { root = NULL; } /********************************************************************/ node* insert(node* current, node* new_node) { if(current == NULL){ return new_node; } else if(strcmp(new_node->str, current->str) <= 0){ current->left = insert(current->left, new_node); } else{ current->right = insert(current->right, new_node); } return current; } /********************************************************************/ node* get_node(char* str) { node* new_node = malloc(sizeof(node)); if(!new_node) return NULL; new_node->str = malloc(strlen(str) + 1); if(!new_node->str) return NULL; return new_node; } /********************************************************************/ void set_node(node* new_node, char* s, char* n) { strcpy(new_node->str, s); new_node->num = atoi(n); new_node->left = new_node->right = NULL; } /********************************************************************/ void traverse(node* current) { if(current == NULL) return; else{ traverse(current->left); printf("%s ", current->str); traverse(current->right); } } /********************************************************************/ node* delete_tree(node* root) { if(root == NULL) return NULL; else{ root->left = delete_tree(root->left); root->right = delete_tree(root->right); free(root->str); free(root); } return NULL; } [END: tree/tree.c]============================================================== ================================================================================ ================================================================================