Hash & C++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Epic wave, 16 Nov 2009.

  1. Epic wave

    Epic wave Member

    Joined:
    15 Mar 2009
    Messages:
    105
    Likes Received:
    72
    Reputations:
    -1
    Если кому не лень, посмотрите пожалуйста прогу на C++, не корректно работает удаление и добавление.

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





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

    код в сообщении ниже и к сожалению виден только через "Edit"
     
    #1 Epic wave, 16 Nov 2009
    Last edited: 17 Nov 2009
    1 person likes this.
  2. Epic wave

    Epic wave Member

    Joined:
    15 Mar 2009
    Messages:
    105
    Likes Received:
    72
    Reputations:
    -1
    Сам код:

    #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.setFree(-1);
    else
    plist.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.getKey() == def_zero)
    cout <<setw(7)<<""<<"|";
    else
    cout <<setw(7)<<alist.getKey()<<"|";

    if(alist.getAdres() == def_zero)
    cout <<setw(8)<<""<<"|";
    else
    cout <<setw(8)<<alist.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.getKey() == def_zero)
    cout <<setw(7)<<""<<"|";
    else
    cout <<setw(7)<<plist.getKey()<<"|";

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

    if(plist.getFree() == def_zero)
    cout <<setw(7)<<""<<"|";
    else
    cout <<setw(7)<<plist.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::eek:ut | 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::eek:ut | 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::eek:ut | 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 есть только у модераторов и админов.
     
    #2 Epic wave, 16 Nov 2009
    Last edited by a moderator: 17 Nov 2009