======Project: Tree library implementation====== A project for Data Structures by Brandon Kennedy during the Fall 2011 Semester. This project was begun on November 1st and is anticipated to take 2 weeks. (give or take a few days for some fun) =====Objectives===== The purpose of this project is to better understand the functionality and use of a binary tree. =====Prerequisites===== In order to successfully accomplish/perform this project, the listed resources/experiences need to be consulted/achieved: * The C programming guide * A basic understanding of the tree structure * understanding of node uses =====Background===== Through this project i am hoping to gain a better understanding of how to utilize a binary tree. I have planned to do this by implementing a tree of character values that will have the following functions: *add a node *remove a node *print the current node values in order I hope that after i finish this project i can use this tree type structure to help evaluate hand values in a poker implementation. =====Scope===== This implementation focuses specificaly on a tree of integer values. It will create a root node and from there it will classify each nodes placement based on the rule "if less go left, if more go right" simple as that! =====Attributes===== *Tree: This project will implement and utilize a binary tree *Malloc: This code implements and utilized many forms of malloc *Pointers: This code uses pointers to structs *Linked lists: This code implements a singly linked list. =====Code===== ===Main.c=== #include"tree.h" int main() { int input; Tree *mytree; mytree = malloc(sizeof(Tree *)); while(input != -1) { printf("Enter a positive integer value: "); scanf("%d", &input); if (input != -1) mytree = add(mytree, input); } printf("Enter - 1 - to add a node\n"); printf("Enter - 2 - to delete a node\n"); printf("Enter - 3 - to print the nodes in post order\n"); scanf("%d", &input); if(input == 1) { printf("Enter a positive integer value: "); scanf("%d", &input); mytree = add(mytree, input); } else if(input == 2) { printf("These are the values in the tree,\n"); printf("please enter a value to delete: "); postpr(mytree -> root); scanf("%d", &input); del(mytree, input); } postpr(mytree -> root); printf("\n"); return 0; } ===Add.c=== /* * add.c, a tree manipulation function. * Made by Brandon Kennedy for Data Structures * Semester: Fall: 2011 * * prototype: Tree *add(Tree *, char); * Returns a tree struct containing the address of the root, tmp, tmp2, and solo nodes.. */ #include"tree.h" Tree *add(Tree *mytree, int val) { Node *grep; grep = malloc(sizeof(Node *)); grep -> value = val; if(mytree -> root != NULL) { mytree -> tmp = mytree -> root; while(mytree -> tmp -> value != val) { if(val < mytree -> tmp -> value) { if(mytree -> tmp -> smaller != NULL) { mytree -> tmp = mytree -> tmp -> smaller; printf("smaller\n"); } else mytree -> tmp -> smaller = grep; } else { if(mytree -> tmp -> bigger != NULL) { mytree -> tmp = mytree -> tmp -> bigger; printf("bigger\n"); } else mytree -> tmp -> bigger = grep; } } } else { mytree -> root = grep; } return mytree; } ===del.c=== #include"tree.h" Tree *del(Tree *mytree, char val) { if(mytree -> root != NULL) { mytree -> tmp = mytree -> root; while(mytree -> tmp -> value != val) { if(val < mytree -> tmp -> value) { if(mytree -> tmp -> smaller -> value = val) { mytree -> solo = mytree -> tmp -> smaller; mytree -> tmp2 = mytree -> solo -> bigger; while(mytree -> tmp2 -> smaller != NULL) { mytree -> tmp2 = mytree -> tmp2 -> smaller; } mytree -> tmp2 -> smaller = mytree -> solo -> smaller; mytree -> tmp -> smaller = mytree -> solo -> bigger; mytree -> solo -> smaller = NULL; mytree -> solo -> bigger = NULL; free(mytree -> solo); } else mytree -> tmp = mytree -> tmp -> smaller; } else { if(mytree -> tmp -> bigger -> value = val) { mytree -> solo = mytree -> tmp -> bigger; mytree -> tmp2 = mytree -> solo -> bigger; while(mytree -> tmp2 -> smaller != NULL) { mytree -> tmp2 = mytree -> tmp2 -> smaller; } mytree -> tmp2 -> smaller = mytree -> solo -> smaller; mytree -> tmp -> smaller = mytree -> solo -> bigger; mytree -> solo -> smaller = NULL; mytree -> solo -> bigger = NULL; free(mytree -> solo); } else mytree -> tmp = mytree -> tmp -> bigger; } } } return mytree; } ===print.c=== #include"tree.h" void postpr(Node *lantro) { if(lantro != NULL) { postpr(lantro -> smaller); printf("%d, ", lantro -> value); postpr(lantro -> bigger); } } ===tree.h=== #ifndef _TREE_H_ #define _TREE_H_ #include #include struct node{ char value; struct node *bigger; struct node *smaller; }; typedef struct node Node; struct tree{ struct node *root; struct node *tmp; struct node *tmp2; struct node *solo; }; typedef struct tree Tree; #endif =====Execution===== lab46:~/src/DataS/Project4$ ./main Enter a positive integer value: 4 Enter a positive integer value: 7 bigger Enter a positive integer value: 2 smaller Enter a positive integer value: 8 bigger bigger Enter a positive integer value: 3 smaller bigger Enter a positive integer value: 6 bigger smaller Enter a positive integer value: 1 smaller smaller Enter a positive integer value: 5 bigger smaller smaller Enter a positive integer value: -1 Enter - 1 - to add a node Enter - 2 - to delete a node Enter - 3 - to print the nodes in post order 3 1, 2, 3, 4, 5, 6, 7, 8, lab46:~/src/DataS/Project4$ =====Reflection===== Be careful what you type! As we were editing this program in VIM we entered the wrong file name to open with :vsp. After that, matt had me do a :r filename. What this did was make a copy of the file we were editing in the wrong file we had opened before. That sucked... Other than that, trees are a wonderful, magical thing! As the tree traverses, say in a searching function, each branch it moves down it removes all other branches on the tree from being possible entries to find.