Доброго времени суток есть два файла PROG.CPP и MODUL.H - это исходники программы, которая реализует хеш-таблицы. Нужно скомпилировать и запустить программу в borland c++ builder или в другой ide, пробую появляется много непонятных ошибок. Помогите пожалуйста откомпилировать и запустить программу.
C++ не знаю абсолютно, изучаю джаву, до си++ ещё не дошёл. PROG.CPP
| Код | #include "modul.h" void main() { char* command; int i_key; hash htbl(17,17); htbl.load_from_file("file.ini"); htbl.insert_loaded(); while (strcmp(command,"exit")!=0) { htbl.view(); gets(command); if (strcmp(command,"add")==0) { htbl.view(); printf("Введите новый ключ: "); scanf("%i",&i_key); htbl.insert(i_key); }; if (strcmp(command,"find")==0) { htbl.view(); printf("Введите искомый ключ: "); scanf("%i",&i_key); htbl.find(i_key); }; if (strcmp(command,"help")==0) { htbl.logo(); htbl.view(); }; if (strcmp(command,"delete")==0) { htbl.view(); printf("Введите удаляемый ключ: "); scanf("%i",&i_key); htbl.delete_key(i_key); }; }; };
|
MODUL.H
| Код | #include <conio.h> #include <stdio.h> #include <alloc.h> #include <string.h> #include <STDLIB.H> struct hash_tbl { int key;//ключ int data;//данные int links;//ссылка }; struct kolision_tbl { int kolision_key;//ключ int kolision_data;//данные(работа с ними не реализована) int kolision_links;//ссылка }; struct info_key { int no_tbl;//номер таблицы int pos; //номер строки int hashf; //вычисленная хеш фу-я для ключа int prekey;//номер строки ссылающегося на него ключа int pretbl;//номер ссылающейся таблицы }; class hash { private: hash_tbl* wrk;//массив хранит основную ХЕШ таблицу kolision_tbl* col;//массив хранит таблицу цепочек переполнения info_key key_info;//структура хранит информацию о текущем ключе char* msg_er;//сообщения об ошибках int* input_key;//массив загруженных ключей int loaded_key;//кол-во загруженных ключей int er_f;//флаг критической ошибки (почти не используется) char ops_msg[80];//оперативные сообщения о выполнении комманд int N;//размер таблицы основной int NC;//размер таблицы цепочек переполнения int hash_f(int i); int col_rekursion(int g); fill(char* c,int n); int find_key(int k); public: int load_from_file(char f_name[]); hash(int n,int nk); int insert(int key); int delete_key(int key); insert_loaded(); int find(int k); view(); logo(); }; hash::insert_loaded()//фу-я добовления загруженных из файла ключей в таблицу { int y; if (loaded_key!=0) { for (y=0;y<loaded_key;y++) insert(input_key[y]); free(input_key); stpcpy(ops_msg,"Ключи из файла успешно добавлены!"); loaded_key=0; }; return(0); }; hash::load_from_file(char f_name[])//фу-я загрузки таблицы из файла { FILE *in; int n; /*формат файла: первая цифра-количество ключей последующие цыфры - ключи */ if ((in = fopen(f_name, "rt"))== NULL) { printf("\nНевозможно открыть файл!\n"); return(1); } else { fscanf(in,"%i",&n); loaded_key=n; if ((input_key=(int*)calloc(n,sizeof(int)))==NULL) { er_f=1; msg_er="Недостаточно памяти !"; }; for(int i=0;i<n;i++) { float f; fscanf(in,"%i",&input_key[i]); } fclose(in); } return(0); } hash::fill(char* c,int n)//функция выводит знаки указанное кол-во раз { for(int d=0; d<n; d++) printf(c); return(0); } hash::view()//процедура отображения таблицы и служебных сообщений { int v; fill("\n",25); puts(ops_msg); puts(msg_er); msg_er="Ошибок нет! "; fill("-",80); for (v=0;v<N;v++) { printf("-%4.1i-%28.1i-%4.1i-",v,wrk[v].key,wrk[v].links); printf("%4.1i-%29.1i-%4.1i-",v,col[v].kolision_key,col[v].kolision_links); }; fill("-",80); return(0); }; hash::hash(int n,int nk)//конструктор класса для работы с хеш таблицами { int m; loaded_key=0; msg_er="Ошибок нет! " ; stpcpy(ops_msg,"Наберите HELP для просмотра опций!"); if ((wrk=(hash_tbl*)calloc(n,sizeof(hash_tbl)))==NULL) { er_f=1; msg_er="Недостаточно памяти !"; }; if ((col=(kolision_tbl*)calloc(nk,sizeof(kolision_tbl)))==NULL) { er_f=1; msg_er="Недостаточно памяти !"; }; N=n; NC=nk; for(m=0;m<n;m++) { wrk[m].links=-2; wrk[m].key=0; }; for(m=0;m<nk;m++) { col[m].kolision_links=-2; col[m].kolision_key=0; }; }; hash::col_rekursion(int g)//рекурсивная прцедура поиска последней записи в цепочке переполнения { if (col[g].kolision_links==-1) return(g); if (col[g].kolision_links>-1) { g=col[g].kolision_links; g=col_rekursion(g); return(g); }; }; hash::find_key(int k)//поиск ключа в таблицах { int guard=0; key_info.hashf=hash_f(k); key_info.prekey=key_info.hashf; key_info.pos=key_info.hashf; key_info.no_tbl=1; key_info.pretbl=key_info.no_tbl; if ((wrk[key_info.hashf].key==k)&&(wrk[key_info.hashf].links>-2)) return(1);//доп условие чтобы не находились нули if (wrk[key_info.hashf].links>-1) { key_info.pretbl=key_info.no_tbl; key_info.no_tbl=2; key_info.pos=wrk[key_info.hashf].links; while (guard<10000)//защита от сбоя структуры таблицы { if (col[key_info.pos].kolision_key==k) return(1); if (col[key_info.pos].kolision_links==-1) return(0); if (col[key_info.pos].kolision_links>-1) key_info.pretbl=key_info.no_tbl; key_info.prekey=key_info.pos; key_info.pos=col[key_info.pos].kolision_links; guard++; }; if (guard>9999) msg_er="Сбой структуры таблиц!"; }; return(0); }; hash::find(int k)//оболочка для получения отчета о поиске ключа { char s[80]=""; char t[10]=""; int f; f=find_key(k); if (f==1) { strcat(s,"Ключ найден"); if (key_info.no_tbl==1) strcat(s," в осн. табл. "); if (key_info.no_tbl==2) strcat(s," в табл. цепочек переп. "); itoa(key_info.pos, t, 10); strcat(s,"номер строки - "); strcat(s,t); if ((key_info.pos!=key_info.prekey)||(key_info.pretbl!=key_info.no_tbl)) { strcat(s," [стр. "); itoa(key_info.prekey, t ,10); strcat(s,t); if (key_info.pretbl==1) strcat(s," в осн.таб.]"); if (key_info.pretbl==2) strcat(s," в таб.цеп.переп.]"); }; stpcpy(ops_msg,s); }; if(f!=1) stpcpy(ops_msg,"Ключ к сожелению не найден!"); return(0); }; hash::hash_f(int i )//собственно процедура расчета ХЕШ функции для всех { //объектов класса i=i%N; return(i); }; hash::delete_key(int key) { if (find_key(key)!=1) { stpcpy(ops_msg,"Не возможно найт указанный ключ в таблицах!"); return(0); }; if (find_key(key)==1) { if(key_info.no_tbl==1) { if(wrk[key_info.pos].links==-1) { wrk[key_info.pos].key=0; wrk[key_info.pos].links=-2; stpcpy(ops_msg,"Ключ удален из таблиц!"); return(1); }; if(wrk[key_info.pos].links>-1) { wrk[key_info.pos].key=col[wrk[key_info.pos].links].kolision_key; wrk[key_info.pos].links=col[wrk[key_info.pos].links].kolision_links; stpcpy(ops_msg,"Ключ удален из таблиц!"); return(1); }; }; if(key_info.no_tbl==2) { col[key_info.pos].kolision_key=0; if (key_info.pretbl==2) col[key_info.prekey].kolision_links=col[key_info.pos].kolision_links; if (key_info.pretbl==1) wrk[key_info.prekey].links=col[key_info.pos].kolision_links; col[key_info.pos].kolision_links=-2; stpcpy(ops_msg,"Ключ удален из таблиц!"); return(1); }; }; return(0); };
hash::insert(int key)//процедура добавления ключа в таблицы { int r; int v; int u;
if (find_key(key)==1) { stpcpy(ops_msg,"Такой ключ уже присутствует в таблице!"); return(0); }; r=hash_f(key); if (wrk[r].links>-1) { u=wrk[r].links; u=col_rekursion(u); for (v=0;v<NC;v++) { if (col[v].kolision_links<-1) { col[v].kolision_key=key; col[v].kolision_links=-1; col[u].kolision_links=v; stpcpy(ops_msg,"Ключ успешно добавлен!"); return(1); }; }; }; if (wrk[r].links==-1) { for (v=0;v<NC;v++) { if (col[v].kolision_links<-1) { col[v].kolision_key=key; col[v].kolision_links=-1; wrk[r].links=v; stpcpy(ops_msg,"Ключ успешно добавлен!"); return(1); }; }; }; if (wrk[r].links<-1) { wrk[r].key=key; wrk[r].links=-1; stpcpy(ops_msg,"Ключ успешно добавлен!"); return(1); }; stpcpy(ops_msg,"Ключ не добавлен. Взможно табл. цепочек переполнена!"); return(0); };
|
|