PDA

Просмотр полной версии : Hash & C++


Epic wave
17.11.2009, 00:46
Если кому не лень, посмотрите пожалуйста прогу на C++, не корректно работает удаление и добавление.

Например : вводим числа 11, 21, 10, 20. Удаляем 11 нормально. Удалем 20 - нормально. Добавляем 50 и уже проблема.





заранее спасибо.

код в сообщении ниже и к сожалению виден только через "Edit"

Epic wave
17.11.2009, 00:50
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <iomanip.h>
#include <string.h>
#include <fstream.h>

#define alist_col 10
#define plist_col 6

#define limit_max 1000
#define limit_min 1

#define def_zero 333

class alistc{
//element table adres

int key; //KEY

int adres;

public:
alistc(){
key = adres = def_zero;
}

int getKey(){
return key;
}

void setKey(int tkey){
key = tkey;
}

int getAdres(){
return adres;
}

void setAdres(int tadres){
adres = tadres;
}

};


class plistc{
//element table perepolnenie

int key; //KEY

int free; //free field

int adres; //adres field

public:

plistc(){
key = free = adres = def_zero;
}

int getKey(){
return key;
}

int getFree(){
return free;
}

int getAdres(){
return adres;
}

void setKey(int tkey){
key = tkey;
}

void setFree(int tfree){
free = tfree;
}

void setAdres(int tadres){
adres = tadres;
}

};

class manager{
//lists
alistc alist[alist_col]; //Adress list
plistc plist[plist_col]; //Perepolnenie list

//Free Space Plist
int HQ;

public:

//default konstruktor
manager(){
//Init FreeSpace
for(int i=0;i<plist_col;i++){
if(i == plist_col-1)
plist[i].setFree(-1);
else
plist[i].setFree(i+1);
}

//Init start FreeSpace
HQ = 0;
}

int getHQ(){
return HQ;
}

void setHQ(int tHQ){
HQ = tHQ;
}

//vivod tablici adresacii
void alist_view(){
//view Alist
cout <<"\n+------------------------+";
cout <<"\n| table 1 |";
cout <<"\n|------------------------|";
cout <<"\n| # | key | adres |";
cout <<"\n|-------|-------|--------|";

for(int i=0;i<alist_col;i++){
cout <<"\n|";
cout <<setw(7)<<i<<"|";

if(alist[i].getKey() == def_zero)
cout <<setw(7)<<""<<"|";
else
cout <<setw(7)<<alist[i].getKey()<<"|";

if(alist[i].getAdres() == def_zero)
cout <<setw(8)<<""<<"|";
else
cout <<setw(8)<<alist[i].getAdres()<<"|";
}

cout <<"\n+-------+-------+--------+";


}

//vivod tablici perepolneniya
void plist_view(){
//view Plist
cout <<"\n+--------------------------------+";
cout <<"\n| table overflow |";
cout <<"\n|--------------------------------|";
cout <<"\n| # | key | adres | free |";
cout <<"\n|-------|-------|--------|-------|";

for(int i=0;i<plist_col;i++){
cout <<"\n|";
cout <<setw(7)<<i<<"|";

if(plist[i].getKey() == def_zero)
cout <<setw(7)<<""<<"|";
else
cout <<setw(7)<<plist[i].getKey()<<"|";

if(plist[i].getAdres() == def_zero)
cout <<setw(8)<<""<<"|";
else
cout <<setw(8)<<plist[i].getAdres()<<"|";

if(plist[i].getFree() == def_zero)
cout <<setw(7)<<""<<"|";
else
cout <<setw(7)<<plist[i].getFree()<<"|";
}

cout <<"\n+--------------------------------+";

}

//Process vvoda klucha
int enter_key(int key){
int tkey;

if(key == 0){
cout <<"\nEnter KEY: ";
cin>>tkey;
} else tkey = key;

return tkey;
}

//Proverka sushestvuet li uzhe takoy KEY
int check_exist_key(int key){
int adres;

adres = getNewAdres(key);

//pole pustoe
if(alist[adres].getKey() == def_zero)
return def_zero;

else if(alist[adres].getKey() == key)
return adres;

else if(alist[adres].getAdres() == def_zero)
return def_zero;

else {
//in plist
int start, temp;
start = alist[adres].getAdres();


do {
if(plist[start].getKey() == key)
return start;

temp = start;
start = plist[start].getAdres();

} while(plist[temp].getAdres() != -1);


if(plist[start].getKey() == key)
return start;

}

return def_zero;
}

//search in adres in Plist
int searchAdresInPlist(int key){
int adres;
adres = alist[getNewAdres(key)].getAdres();

if(adres == def_zero){
cout <<"\nError: Plist in clean! Ups -((";
return def_zero;

} else if(adres == -1){
cout <<"\nError: Not next element";
return def_zero;

} else {
//chert -( pridensya iskat`
int start = adres;

do{
start = plist[start].getAdres();
} while(plist[start].getAdres() != key);

return start;
}

return def_zero;
}

//Proverka klucha
int check_key(int key){

//if key == def_zero
if(key == def_zero){
cout <<"\nreserved by system";
return 1;
}

//Check exists key
if(check_exist_key(key) != def_zero){
cout <<"\nthis key using now";
return 1;
}

//etc proverki

return 0;
}

//Vichislenie adresa
int getNewAdres(int key){
//vichislenie adresa
int adres;

adres = key%10;

return adres;
}

//Poisk svobodnogo polya v tablice perepolneniy
int getFreePlist(){
//poisk svobodnogo mesta

return HQ;
}

//Proverka... est li koliziya
int isKolision(int adres){
//proverka na kolisiu

if(alist[adres].getKey() == def_zero)
return 0;
else
return 1;
}

//Poisk poslednego elementa v cepochke
int searchInPlist(int key, int adres){
//poisk in Plist

//cool method
int start;
start = alist[adres].getAdres();

if(start == -1)
return start;

while(plist[start].getAdres() != -1){
start = plist[start].getAdres();
}

return start;
}


//Poisk klucha
int searchKey(int key){
//search in alist and plist
int exist;

exist = check_exist_key(key);

//proverka na pustoe znachenie
if(exist == def_zero){
cout <<"\nElement '"<<key<<"' not found (def_zero)";
return def_zero;

//Proverka na sovpadenie v glavnom spiske
} else if(alist[exist].getKey() == key){
cout <<"\nElement '"<<key<<"' table 1. # = `"<<exist<<"`.";
return exist;

//Proverka v spiske perepolneniya
} else if(plist[exist].getKey() == key){
cout <<"\nElement `"<<key<<"` table 2. # = `"<<exist<<"`.";
return exist;
} else {
cout <<"\not found";
return def_zero;
}

}

//Process delete
void del(int key){
int search;

search = searchKey(key);

if(search != def_zero){
//KEY found!!!

if(alist[search].getKey() == key){
//Element nahoditsya v AList
if(alist[search].getAdres() == def_zero){
//element odinokiy ... mojno prosto udalyat
alist[search].setKey(def_zero);
alist[search].setAdres(def_zero);

} else {
//u nas hot i v glavnoy, no imeet cepochku ...
int krep;
krep = alist[search].getAdres();

//replace from plist to alist
alist[search].setKey(plist[krep].getKey());
alist[search].setAdres(plist[krep].getAdres());

//clean plist
plist[krep].setKey(def_zero);
plist[krep].setAdres(def_zero);
plist[krep].setFree(getHQ());

//set HQ
setHQ(krep);

}
} else {
//Element nahoditsya v PList
//search - index in plist

if(plist[search].getAdres() == -1){
//pered nami posledniy element spiska
int newadres;

newadres = searchAdresInPlist(key);

if(newadres != def_zero){
//replace link
plist[newadres].setAdres(-1);

//delete
plist[search].setKey(def_zero);
plist[search].setAdres(def_zero);
plist[search].setFree(getHQ());

//set HQ
setHQ(search);

} else {
cout <<"\nError delete: searchAdresInPlist error (def_zero)";
}

} else {
//element v seredine
int krep;
krep = plist[search].getAdres();

//replace plist up plist
plist[search].setKey(plist[krep].getKey());
plist[search].setAdres(plist[krep].getAdres());

//clean plist
plist[krep].setKey(def_zero);
plist[krep].setAdres(def_zero);
plist[krep].setFree(getHQ());

//set HQ
setHQ(krep);
}
}

} else {
//KEY not found
cout <<"\nKey not found";

}
}

//dobavlenie, kogda est kolisiya
void addUseKolision(int key, int adres){
int free;

free = getFreePlist();

if(free == -1){
cout <<"\nerror";
} else {

//add to plist
plist[free].setKey(key);
plist[free].setAdres(-1);

setHQ(plist[free].getFree());

plist[free].setFree(def_zero);

if(alist[adres].getAdres() == def_zero){
//tablica perepolneniya pusta

//add adres to alist
alist[adres].setAdres(free);

} else {
//est ssilka na tablicu perepolneniya
int end;

//search in plist
end = searchInPlist(key, adres);

//change to pre end
plist[end].setAdres(free);

}
}
}

//Dobavlenie, kogda net kolizii
void addNotUseKolision(int key, int adres){
alist[adres].setKey(key);
alist[adres].setAdres(def_zero);
}

//Insert process
void insert(){
//insert element
int key, adres;

//vvod i proverka klucha
key = enter_key(0);
while(check_key(key)){
key = enter_key(0);
}

//get Adres
adres = getNewAdres(key);

//proverka na kolisiu
if(isKolision(adres)){
//est kolisiya

addUseKolision(key, adres);
} else {
//netu mojno prosto dobavlyat

addNotUseKolision(key, adres);
}

}

//Insert Face
void insertFace(){
int num;

cout <<"\nKolichestvo elementov: ";
cin >>num;

while(num<limit_min || num>limit_max){
cout <<"\nDefenition : ["<<limit_min<<";"<<limit_max<<"]";
cout <<"\nHow many elements? : ";
cin>>num;
}

for(int i=1;i<=num;i++){
insert();
}

}

//Save to file
void saveToFile(){
//Save Alist
ofstream out("lalist", ios::out | ios::binary);
if(!out){
cout <<"\nError save AList: don`t open file";
} else {
out.write((char *) &alist, sizeof alist);
out.close();
}

//Save Plist
ofstream out2("lplist", ios::out | ios::binary);
if(!out2){
cout <<"\nError save Plist: don`t open file";
} else {
out2.write((char *) &plist, sizeof plist);
out2.close();
}

//Save HQ
ofstream out3("lHQlist", ios::out | ios::binary);
if(!out3){
cout <<"\nError save HQ: don`t open file";
} else {
out3.write((char *) &HQ, sizeof HQ);
out3.close();
}
}

//Read from file
void readFromFile(){
//Read Alist
ifstream in("lalist", ios::in | ios::binary);
if(!in){
cout <<"\nError open Alist: don`t open file";
} else {
in.read((char *) &alist, sizeof alist);
in.close();
}

//Read Plist
ifstream in2("lplist", ios::in | ios::binary);
if(!in2){
cout <<"\nError open Plist: don`t open file";
} else {
in2.read((char *) &plist, sizeof plist);
in2.close();
}

//Read HQ
ifstream in3("lHQlist", ios::in | ios::binary);
if(!in3){
cout <<"\nError open HQlist: don`t open file";
} else {
in3.read((char *) &HQ, sizeof HQ);
}
}

};

void main(){
clrscr();
int option;

manager man;

//Menu
do {
cout <<"\n menu\n";
cout <<"1. Create\n";
cout <<"2. Output\n";
cout <<"3. Search by element\n";
cout <<"4. Insert element\n";
cout <<"5. Delete by element\n";
cout <<"6. Save\n";
cout <<"7. Open\n";
cout <<"0. Exit\n";

cout<<"\nEnter action: ";
cin>>option;

switch(option){
case 1:
//Create
clrscr();

man.insertFace();
break;

case 2:
//OutPut
clrscr();

man.alist_view();
man.plist_view();



getch();
break;

case 3:
//Search
clrscr();

int key;
cout <<"\nEnter KEY for search: ";
cin >>key;

man.searchKey(key);
break;

case 4:
//Insert
clrscr();

man.insertFace();
break;

case 5:
//Delete
clrscr();

int key_for_delete;
cout <<"\nEnter KEY for delete: ";
cin >>key_for_delete;

man.del(key_for_delete);
break;

case 6:
//Save to file
clrscr();

man.saveToFile();
break;

case 7:
//Read from file
clrscr();

//read data
man.readFromFile();

//view table
man.alist_view();
man.plist_view();

//view HQ


getch();
break;

}

} while(option!=0);

}

----
SLESH: Код не виден - баг парсера BB тегов. Лучше уж такой вид, потому, что кнопочка Edit есть только у модераторов и админов.