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