Thanks! I took your advice which made it a lot better. As far as resetting the static int I made the function return a pointer to a static int, returned the address to the int and reset it to 1 when I exited the function call in printTraversal function. I changed gets() to fgets(inputArray,256,stdin) I hope that is right, it seems to work. Need to work on a single delete function and multi delete function and then I am done. Any suggestions on a delete function? Not sure how to search through the tree. What things to I need to keep track of? Also the teacher wants the immediate predecessor as the replacement. Thanks again!
Code:
#include <stdio.h>
#define SIZE 15
#define ARRAYSIZE 80
#define PRINT 10
//*************STRUCTS*****************
struct treeNode
{
int data;
struct treeNode *rChild;
struct treeNode *lChild;
};
//**************************************//
//***********FUNCTION PROTOTYPES********//
struct treeNode *makeTreeNode(int number);
void readArrayIntoTree(int *treeArray, struct treeNode **rootPtr);
void insertInTree(struct treeNode **rootPtr, int number);
void printTraversal(struct treeNode *rootPtr);
static int *preOrderTraversal(struct treeNode *rootPtr);
static int *inOrderTraversal(struct treeNode *rootPtr);
static int *postOrderTraversal(struct treeNode *rootPtr);
//void deleteFirstNode(struct treeNode **rootPtr, int number);
//******END OF FUNCTION PROTOTYPES******//
/* //working on function
void deleteFirstNode(struct treeNode **rootPtr, int number)
{
struct treeNode *deleteNodePtr = '\0';
struct treeNode *parentPtr = '\0';
deleteNodePtr = *rootPtr;
parentPtr = *rootPtr;
while(deleteNodePtr != '\0' && deleteNodePtr->data != number)
{
parentPtr->data = deleteNodePtr->data;
if(number <= deleteNodePtr->data)
{
deleteNodePtr = deleteNodePtr->lChild;
}
else
{
deleteNodePtr = deleteNodePtr->rChild;
}
}
if(deleteNodePtr == '\0')
{
printf("\n*****Node value does not exist in the tree*****\n\n");
}
}
*/
//************************MAIN************************//
int main()
{
struct treeNode *rootPtr = '\0';
int number;
int index = 1;
int treeArray[15] ={60,75,40,32,55,80,70,74,68,69,85,90,84,65,28};
char ch;
char selection;
char inputArray[256];
char numberArray[256];
printf("-->[E] or [e] will exit the program<--\n\n");
readArrayIntoTree(treeArray, &rootPtr);
do
{
printf("Enter a command---> ");
fgets(inputArray,256,stdin);
selection = inputArray[0];
number = atoi(&inputArray[1]);
switch(toupper(selection))
{
case 'A':
insertInTree(&rootPtr, number);
break;
case 'D':
deleteFirstNode(&rootPtr, number);
break;
case 'S':
break;
case 'P':
printTraversal(rootPtr);
break;
case 'E':
printf("\n\n\n");
break;
default:
printf("\n\n*****You have entered an invalid command [a/A, d/D, s/S, p/P, e/E]*****\n\n\n");
}
}while(selection != 'e' && selection != 'E');
system("PAUSE");
return 0;
}
//************END OF MAIN**************//
//**********MAIN PROTOTYPED FUNCTIONS**//
struct treeNode *makeTreeNode(int number)
{
struct treeNode *newTreePtr = '\0';
newTreePtr = (struct treeNode*)malloc(sizeof(struct treeNode));
newTreePtr->lChild = '\0';
newTreePtr->rChild = '\0';
newTreePtr->data = number;
return newTreePtr;
}
void readArrayIntoTree(int *treeArray, struct treeNode **rootPtr)
{
int index;
for(index=0;index<SIZE;index++)
{
insertInTree(rootPtr, (*(treeArray + index)));
}
}
void insertInTree(struct treeNode **rootPtr, int number)
{
struct treeNode *newTreePtr = '\0';
struct treeNode *currTreePtr = '\0';
struct treeNode *insertLocationPtr = '\0';
newTreePtr = makeTreeNode(number);
if(*(rootPtr) == '\0')
{
*rootPtr = newTreePtr;
}
else
{
currTreePtr = *rootPtr;
while(currTreePtr != '\0')
{
insertLocationPtr = currTreePtr;
if(newTreePtr->data > currTreePtr->data)
{
currTreePtr = currTreePtr->lChild;
}
else
{
currTreePtr = currTreePtr->rChild;
}
}
if(newTreePtr->data > insertLocationPtr->data)
{
insertLocationPtr->lChild = newTreePtr;
}
else
{
insertLocationPtr->rChild = newTreePtr;
}
}
}
static int *preOrderTraversal(struct treeNode *rootPtr)
{
static int pre_counter = 1;
if(rootPtr != '\0')
{
printf("%-5i",rootPtr->data);
pre_counter++;
if(pre_counter > PRINT)
{
printf("\n\t\t\t");
pre_counter = 1;
}
preOrderTraversal(rootPtr->lChild);
preOrderTraversal(rootPtr->rChild);
}
return &pre_counter;
}
static int *inOrderTraversal(struct treeNode *rootPtr)
{
static int in_counter = 1;
if(rootPtr != '\0')
{
inOrderTraversal(rootPtr->lChild);
printf("%-5i",rootPtr->data);
in_counter++;
if(in_counter > PRINT)
{
printf("\n\t\t\t");
in_counter = 1;
}
inOrderTraversal(rootPtr->rChild);
}
return &in_counter;
}
static int *postOrderTraversal(struct treeNode *rootPtr)
{
static int post_counter = 1;
if(rootPtr != '\0')
{
postOrderTraversal(rootPtr->lChild);
postOrderTraversal(rootPtr->rChild);
printf("%-5i",rootPtr->data);
post_counter++;
if(post_counter > PRINT)
{
printf("\n\t\t\t");
post_counter = 1;
}
}
return &post_counter;
}
void printTraversal(struct treeNode *rootPtr)
{
int *reset;
if(rootPtr == '\0')
{
printf("*****No nodes to print*****");
}
else
{
printf("\n\t\tThe preorder traversal is:\n\n");
printf("\t\t\t");
reset = preOrderTraversal(rootPtr);
*reset = 1;
printf("\n\n");
printf("\t\tThe inorder traversal is:\n\n");
printf("\t\t\t");
reset = inOrderTraversal(rootPtr);
*reset = 1;
printf("\n\n");
printf("\t\tThe postorder traversal is:\n\n");
printf("\t\t\t");
reset = postOrderTraversal(rootPtr);
*reset = 1;
printf("\n\n");
}
}
//**********END OF MAIN FUNCTIONS**********//