Если кому не лень, посмотрите пожалуйста прогу на C++, не корректно работает удаление и добавление. Например : вводим числа 11, 21, 10, 20. Удаляем 11 нормально. Удалем 20 - нормально. Добавляем 50 и уже проблема. заранее спасибо. код в сообщении ниже и к сожалению виден только через "Edit"
Сам код: #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: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: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: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 есть только у модераторов и админов.