295 lines
7.9 KiB
C++
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);
|
|
}
|