diff --git a/defs.h b/defs.h new file mode 100644 index 0000000..5f8f3f2 --- /dev/null +++ b/defs.h @@ -0,0 +1,15 @@ +const int BUFFERSIZE = 100; //f�r s�ker inmatning +const int NAMESIZE = 8; //f�r MS-DOS 6.0 +#define FALSE 0 +#define TRUE !FALSE + +typedef int dataType; //s�tter datatypen +struct treeNode; //f�rvarnar datorn om en struct +typedef treeNode *ptrType; //ger en pekartype till en struct +struct treeNode //en nod i tr�det +{ + dataType data; + ptrType left; + ptrType right; + treeNode(dataType item, ptrType left, ptrType right); +}; diff --git a/huvud.cpp b/huvud.cpp new file mode 100644 index 0000000..37fca61 --- /dev/null +++ b/huvud.cpp @@ -0,0 +1,184 @@ +#include //f�r in och utmatning +#include +#include "defs.h" +#include "tree.h" + +using namespace std; +int mataIn() +{ + char buffer[BUFFERSIZE]; + int f; + do + { + cin >> buffer; + if (strcmp(buffer, "0") == 0) + return 0; + else + { + f = atoi(buffer); + if (f != 0) + return f; + else + cout << " Inget tal, f�rsok igen: "; + } + } while (!f); + return 0; +} +void _insert(treeClass &myTree) +{ + dataType item; + cout << " Vad vill du s�tta in i tr�det: "; + item = mataIn(); + myTree.insert(myTree.root, item); +} +void _del(treeClass &myTree) +{ + if (!myTree.isEmpty()) + { + dataType item; + cout << " Vad vill du ta bort : "; + item = mataIn(); + if (myTree.seek(myTree.root, item) != NULL) + { + myTree.del(myTree.root, item); + return; + } + else + cout << " Noden " << item << " finns inte. "; + } + else + cout << " Du har inte gjort n�got tr�d �nnu... "; +} +void _preOrder(treeClass myTree) +{ + if (!myTree.isEmpty()) + myTree.preOrder(myTree.root); + else + cout << " Du har inte gjort n�got tr�d �nnu... "; +} +void _inOrder(treeClass myTree) +{ + if (!myTree.isEmpty()) + myTree.inOrder(myTree.root); + else + cout << " Du har inte gjort n�got tr�d �nnu... "; +} +void _postOrder(treeClass myTree) +{ + if (!myTree.isEmpty()) + myTree.postOrder(myTree.root); + else + cout << " Du har inte gjort n�got tr�d �nnu... "; +} +void _seek(treeClass myTree) +{ + if (!myTree.isEmpty()) + { + dataType item; + cout << " Mata in s�kta v�rdet: "; + item = mataIn(); + if (myTree.seek(myTree.root, item) != NULL) + cout << " Ja, noden " << item << " fanns med..."; + else + cout << " Nej, noden " << item << " fanns inte med..."; + } + else + cout << " Du har inte gjort n�got tr�d �nnu... "; +} +void _save(treeClass myTree) +{ + if (!myTree.isEmpty()) + { + fstream fil; + char filnamn[NAMESIZE]; + cout << " Ange filnamn att spara: "; + cin >> filnamn; + fil.open(filnamn, ios::out | ios::binary); + myTree.save(myTree.root, fil); + fil.close(); + } + else + cout << " Du har inte gjort n�got tr�d �nnu..."; +} +void _load(treeClass &myTree) +{ + if (myTree.isEmpty()) + { + fstream fil; + dataType item; + char filnamn[NAMESIZE]; + cout << " Ange filnamn att h�mta: "; + cin >> filnamn; + fil.open(filnamn, ios::in | ios::binary); + if (fil) + while (fil.peek() != EOF) + { + fil.read((char *)&item, sizeof(item)); + myTree.insert(myTree.root, item); + } + else + cout << " Filen finns inte..."; + fil.close(); + } + else + cout << " Det finns redan v�rden i tr�det. \n" + << " Du m�ste ta bort samtliga noder \n" + << " eller starta om programmet f�re \n" + << " du kan h�mta ett tr�d fr�n fil \n"; +} +void meny() +{ + cout << " \n BIN�RT S�K TR�D " + << " \n --------------- " + << " \n 1. L�gg till nod " + << " \n 2. Ta bort nod " + << " \n 3. S�k efter nod " + << " \n 4. Skriv ut i preorder " + << " \n 5. Skriv ut i inorder " + << " \n 6. Skriv ut i postorder " + << " \n 7. Spara tr�det p� fil " + << " \n 8. H�mta tr�d fr�n fil " + << " \n 0. Avsluta \n "; +} +int main() +{ + treeClass myTree; + char val = TRUE; + do + { + meny(); + cin >> val; + switch (val) + { + case '1': + _insert(myTree); + break; + case '2': + _del(myTree); + break; + case '3': + _seek(myTree); + break; + case '4': + _preOrder(myTree); + break; + case '5': + _inOrder(myTree); + break; + case '6': + _postOrder(myTree); + break; + case '7': + _save(myTree); + break; + case '8': + _load(myTree); + break; + case '0': + cout << " Programmet avslutat"; + break; + default: + cout << " Felaktigt val"; + } + } while (val != '0'); +} diff --git a/tree.cpp b/tree.cpp new file mode 100644 index 0000000..cdcfb35 --- /dev/null +++ b/tree.cpp @@ -0,0 +1,131 @@ +#include +#include "defs.h" +#include "tree.h" +using namespace std; + +treeClass::treeClass():root(NULL) { } + +treeNode::treeNode(dataType item, ptrType L, ptrType R): + data(item),left(L),right(R) { } + +bool treeClass::isEmpty() +{ + if (root==NULL) + return TRUE; + else + return FALSE; +} +void treeClass::preOrder(ptrType treeNode) +{ + if(treeNode) + { + cout << " "; + cout << treeNode->data; + preOrder(treeNode->left); + preOrder(treeNode->right); + } +} +void treeClass::inOrder(ptrType treeNode) +{ + if(treeNode) + { + inOrder(treeNode->left); + cout << treeNode->data << " "; + inOrder(treeNode->right); + } +} +void treeClass::postOrder(ptrType treeNode) +{ + if(treeNode) + { + postOrder(treeNode->left); + postOrder(treeNode->right); + cout << treeNode->data << " "; + } +} +ptrType treeClass::seek(ptrType root, dataType item) +{ + ptrType treeNodeFound; + if(root == NULL) + treeNodeFound = NULL; + else if (root->data == item) + treeNodeFound = root; + else if (root->data > item) + treeNodeFound = seek(root->left, item); + else + treeNodeFound = seek(root->right, item); + return treeNodeFound; +} +void treeClass::insert(ptrType &root,dataType item) +{ + if(root==NULL) + root=new treeNode(item,NULL,NULL); + else if(item < root->data) + insert(root->left,item); + else + insert(root->right,item); +} +void treeClass::delLeft(ptrType &root, dataType &item) +{ + if((root != NULL) && (root->left == NULL)) + { + item = root->data; + ptrType delPtr = root; + root = root->right; + delPtr->right = NULL; + delete delPtr; + } + else + delLeft(root->left, item); +} +void treeClass::delRoot(ptrType &root) +{ + ptrType delPtr; + dataType nyItem; + + if(root != NULL) + { + if((root->left == NULL) && (root->right == NULL)) + { + delete root; + root = NULL; + } + else if(root->left == NULL) + { + delPtr = root; + root = root->right; + delPtr->right = NULL; + delete delPtr; + } + else if(root->right == NULL) + { + delPtr = root; + root = root->left; + delPtr->left = NULL; + delete delPtr; + } + else + { + delLeft(root->right, nyItem); + root->data = nyItem; + } + } +} +void treeClass::del(ptrType &root, dataType item) +{ + if(item==root->data) + delRoot(root); + else if(item < root->data) + del(root->left, item); + else + del(root->right,item); +} +void treeClass::save(ptrType root, fstream &fil) +{ + if(root) + { + fil.write((char*)&root->data,sizeof(root)); + save(root->left,fil); + save(root->right,fil); + } +} diff --git a/tree.h b/tree.h new file mode 100644 index 0000000..67be00a --- /dev/null +++ b/tree.h @@ -0,0 +1,19 @@ +#include + +class treeClass +{ + public: + treeClass(); + ~treeClass(){}; + ptrType root; + ptrType seek(ptrType root, dataType item); + bool isEmpty(); + void insert(ptrType &root,dataType item); + void del(ptrType &root,dataType item); + void delRoot(ptrType &root); + void delLeft(ptrType &root, dataType &item); + void preOrder(ptrType treeNode); + void inOrder(ptrType treeNode); + void postOrder(ptrType treeNode); + void save(ptrType root, std::fstream &fil); +};