Startpunkt

This commit is contained in:
2026-03-05 09:47:42 +01:00
parent 7de38b4119
commit eb98c1eec3
4 changed files with 349 additions and 0 deletions

15
defs.h Normal file
View 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
View 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
View 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
View 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);
};