Startpunkt
This commit is contained in:
15
defs.h
Normal file
15
defs.h
Normal file
@@ -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<74>det
|
||||||
|
{
|
||||||
|
dataType data;
|
||||||
|
ptrType left;
|
||||||
|
ptrType right;
|
||||||
|
treeNode(dataType item, ptrType left, ptrType right);
|
||||||
|
};
|
||||||
184
huvud.cpp
Normal file
184
huvud.cpp
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
#include <iostream> //f<>r in och utmatning
|
||||||
|
#include <cstring>
|
||||||
|
#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<74>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<74>d <20>nnu... ";
|
||||||
|
}
|
||||||
|
void _preOrder(treeClass myTree)
|
||||||
|
{
|
||||||
|
if (!myTree.isEmpty())
|
||||||
|
myTree.preOrder(myTree.root);
|
||||||
|
else
|
||||||
|
cout << " Du har inte gjort n<>got tr<74>d <20>nnu... ";
|
||||||
|
}
|
||||||
|
void _inOrder(treeClass myTree)
|
||||||
|
{
|
||||||
|
if (!myTree.isEmpty())
|
||||||
|
myTree.inOrder(myTree.root);
|
||||||
|
else
|
||||||
|
cout << " Du har inte gjort n<>got tr<74>d <20>nnu... ";
|
||||||
|
}
|
||||||
|
void _postOrder(treeClass myTree)
|
||||||
|
{
|
||||||
|
if (!myTree.isEmpty())
|
||||||
|
myTree.postOrder(myTree.root);
|
||||||
|
else
|
||||||
|
cout << " Du har inte gjort n<>got tr<74>d <20>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<74>d <20>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<74>d <20>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<74>det. \n"
|
||||||
|
<< " Du m<>ste ta bort samtliga noder \n"
|
||||||
|
<< " eller starta om programmet f<>re \n"
|
||||||
|
<< " du kan h<>mta ett tr<74>d fr<66>n fil \n";
|
||||||
|
}
|
||||||
|
void meny()
|
||||||
|
{
|
||||||
|
cout << " \n BIN<49>RT S<>K TR<54>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<74>det p<> fil "
|
||||||
|
<< " \n 8. H<>mta tr<74>d fr<66>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');
|
||||||
|
}
|
||||||
131
tree.cpp
Normal file
131
tree.cpp
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#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);
|
||||||
|
}
|
||||||
|
}
|
||||||
19
tree.h
Normal file
19
tree.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
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);
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user