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 есть только у модераторов и админов.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot