Files
2026-03-05 13:39:39 +01:00

295 lines
7.9 KiB
C++

//##################################################################
// PROGRAMMERINGSUPPGIFT 3
// DATASTRUKTURER OCH ALGORITMER
// HASH TABELL
//==================================================================
// HUVUD.CPP
// Filen innehåller huvudprogrammet
// Christian Ohlsson
// Ingela Johansson
// Anna-Maria Haglund
// Karlstad 981007
//==================================================================
#include "header.hpp"
//###############################################################
// SÄKER INMATNING AV MENYVAL
// ser till att bara en character matas in
// som menyval som dessutom måste vara en siffra
//===============================================================
char mataInChar()
{
bool test = FALSE;
char temp, svar;
do {
temp = getch();
if(isalnum(temp) && test == FALSE) {
cout << temp;
svar = temp;
test = TRUE;
}
else if(temp == BACKSPACE && test == TRUE) {
gotoxy(wherex()-1, wherey());
cout << " ";
gotoxy(wherex()-1, wherey());
test = FALSE;
}
}while(temp != ENTER || test == FALSE);
return svar;
}
//##################################################################
//Function:
//Task:
//Calls:
//==================================================================
void _insert(hashClass &hashTable)
{
nameType name;
numberType number;
hashNode newNode;
int location;
if(hashTable.biggerHash() == FALSE) {
cout << "\n Skriv in namn: ";
cin >> name;
if(hashTable.search(name) == FALSE) {
cout << "\n Skriv in nummer: ";
cin >> number;
strcpy(newNode.name, name);
strcpy(newNode.number, number);
location = hashTable.hash1(name);
if(hashTable.hashPtr[location].exist == FALSE)
hashTable.insert(location, newNode);
else
while(hashTable.hashPtr[location].exist == TRUE) {
location = location + hashTable.hash2(hashTable.hash1(newNode.name));
if(location > hashTable.getSize())
location = location - hashTable.getSize();
if(hashTable.hashPtr[location].exist == FALSE) {
hashTable.insert(location, newNode);
return;
}
}
}
else {
cout << "\n Du har redan satt in " << name << " i katalogen";
getch();
}
}
else
hashTable.newHashArray();
}
//##################################################################
//Function:
//Task:
//Calls:
// TAR BORT EN NOD UR TRÄD
// calls: hashClass::del, getSize, search, hash1, hash2
//==================================================================
void _del(hashClass &hashTable)
{
nameType name;
int location;
cout << "\n Vem vill du ta bort: ";
cin >> name;
if(hashTable.search(name)) {
if(hashTable.anotherHash() == FALSE) {
location = hashTable.hash1(name);
if(strcmp(hashTable.hashPtr[location].name, name) == 0)
hashTable.del(location);
else {
while(hashTable.hashPtr[location].exist == TRUE) {
location = location + hashTable.hash2(hashTable.hash1(name));
if(location > hashTable.getSize())
location = location - hashTable.getSize();
if(strcmp(hashTable.hashPtr[location].name, name) == 0)
hashTable.del(location);
}
}
}
else
hashTable.reHash(hashTable.getSize());
}
else {
cout << " " << name << " finns inte i telefonkatalogen";
getch();
}
}
//##################################################################
//Function:
//Task:
//Calls:
// SKRIVER UT I INORDER
// calls: hashClass::print
//==================================================================
void _print(hashClass &hashTable)
{
int size = hashTable.getSize();
clrscr();
cout << "Plats"
<< setw(TABSIZE-3)
<< "Namn"
<< setw(TABSIZE)
<< "Nummer"
<< "\n-------------------------------------------";
for(int i=0 ; i < size ; i++)
if(hashTable.hashPtr[i].exist == TRUE && hashTable.hashPtr[i].name[0])
cout << endl
<< i
<< setw(TABSIZE)
<< hashTable.hashPtr[i].name
<< setw(TABSIZE)
<< hashTable.hashPtr[i].number;
cout << "\n\n\n\n Arrayen är nu " << size << " stor"
<< "\n och " << hashTable.checkOccupied() << " platser är upptagna.";
getch();
}
//##################################################################
//Function:
//Task:
//Calls:
// SÖKER I TRÄDET
// calls: hashClass::search
// calls: hashClass::isEmpty
//==================================================================
void _search(hashClass &hashTable)
{
hashNode newNode;
nameType name;
cout << "\n Mata in namn: ";
cin >> name;
if(hashTable.search(name)) {
newNode = hashTable.getNode(name);
cout << "\n "
<< newNode.name
<< " har telefonnummer "
<< newNode.number
<< ".";
}
else
cout << " " << name << " finns inte i telefonkatalogen";
getch();
}
//##################################################################
//Function:
//Task:
//Calls:
// SPARAR TRÄDET PÅ FIL
// calls: hashClass::save
// calls: hashClass::isEmpty
//==================================================================
void _save(hashClass &hashTable)
{
fstream fil;
char filnamn[FILENAMESIZE];
cout << "\n Ange filnamn att spara: ";
cin >> filnamn;
fil.open(filnamn,ios::out|ios::binary);
hashTable.save(fil);
fil.close();
}
//##################################################################
//Function:
//Task:
//Calls:
// HÄMTAR ETT TRÄD FRÅN EN FIL
// läser in värdet i varje nod i preorder
// och sätter in det i trädet i preoder
// calls hashClass::insert
// calls: hashClass::isEmpty
//==================================================================
void _load(hashClass &hashTable)
{
fstream fil;
int i = 0;
char filnamn[FILENAMESIZE];
cout << "\n Ange filnamn att hämta: ";
cin >> filnamn;
hashTable.destroyHash(hashTable.getSize());
fil.open(filnamn,ios::in|ios::binary);
if(fil) {
while(fil.peek() != EOF) {
fil.read((char*)& hashTable.hashPtr[i],sizeof(hashTable.hashPtr[i]));
hashTable.insert(i, hashTable.hashPtr[i]);
i++;
}
}
else {
cerr << "\n Filen finns inte...";
getch();
}
hashTable.reHash(hashTable.getSize());
fil.close();
}
//##################################################################
//Function:
//Task:
//Calls:
// DESTROYTREE
// tar bort hela trädet
// calls: hashClass::isEmpty
// calls: hashClass::destroyHash
//==================================================================
void _destroyHash(hashClass &hashTable)
{
hashTable.destroyHash(hashTable.getSize());
cerr << "\n Telefonkatalogen är tom...";
getch();
}
//##################################################################
//Function:
//Task:
//Calls:
// MENY ITEMS
// skriver ut menyn på skärmen
//==================================================================
void meny()
{
clrscr();
cout << " \n TELEFON KATALOGEN "
<< " \n ----------------- "
<< " \n 1. Lägg till person "
<< " \n 2. Ta bort person "
<< " \n 3. Sök efter person "
<< " \n 4. Skriv ut "
<< " \n 5. Spara på fil "
<< " \n 6. Hämta från fil "
<< " \n 7. Radera hela katalogen "
<< " \n 0. Avsluta ";
gotoxy(2,12); //ställer markören under menyn
}
//##################################################################
//Function:
//Task:
//Calls:
// MAIN FUNCTION
// skapar trädet hashTable av typen hashClass
// calls: alla drivrutiner
//==================================================================
void main()
{
hashClass hashTable;
char val;
do {
meny();
val = mataInChar();
switch (val)
{
case '1' : _insert(hashTable);break;
case '2' : _del(hashTable);break;
case '3' : _search(hashTable);break;
case '4' : _print(hashTable);break;
case '5' : _save(hashTable);break;
case '6' : _load(hashTable);break;
case '7' : _destroyHash(hashTable);break;
case '0' : cout << "\n Programmet avslutat";break;
default : cerr << "\n Felaktigt val";getch();
}
}while(val != '0');
exit(0);
}