ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 18.04.2025
Просмотров: 393
Скачиваний: 0
class ErrInvChain {}; //невозможная цепочка
class Ident
{
private:
elem *mas;
int *ABC;
int size;
int end;
public:
Ident();
~Ident();
int Add (elem z);
int Search (elem el);
void Delete (elem el);
friend void Prints(Ident &I);
inline int Size() {return size;}
inline elem Get(int n) {return mas[ABC[n]];}
};
#endif
Data.Cpp
#pragma hdrstop
#include "DataBase.h"
#include "string.h"
#define CONST 0.6180339887498948482
#define MAX 1000
//------------------------------------------------------------------------------------------------------------------------------------------------------
Ident::Ident()
{
size = 0;
end = MAX;
mas = new elem[MAX];
ABC = new int[MAX];
for (int i = 0; i < MAX; ++i)
mas[i].name[0] = '\0';
}
//------------------------------------------------------------------------------------------------------------------------------------------------------
Ident::~Ident()
{
delete [] mas;
delete [] ABC;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------
int Hesh (int d, char *c, char name[] = 0)
{
int k = 0;
for (int i = 0; c[i] != '\0'; ++i)
k += c[i];
if (name != 0)
for (int i = 0; name[i] != '\0'; ++i)
k += name[i];
int m = k * CONST;
return d * (k * CONST - m);
}
//------------------------------------------------------------------------------------------------------------------------------------------------------
int Ident::Add(elem z)//возвр. -1, вставляя запись, или -2 при переполн.
{
z.link = -1; //пустая ссылка
int ind;
if (size == 0)
ind = Hesh (MAX, z.name); //позиция ind отображения
else
ind = Hesh (MAX, z.name, mas[ABC[size-1]].name);
if (mas[ind].name[0] == '\0') //позиция свободна
{
//AddABC(z, ind);
ABC[size] = ind;
mas[ind] = z;
size++;
return -1; //вставка
}
int k;
for (;ind >= 0; k = ind, ind = mas[ind].link)
{}//if (!strcmp(mas[ind].name, z.name))
//return 0; //запись уже есть
/*Описание второго рипита-антила: r идет от конца массива к началу,
занятые позиции отмечены T[r].key == MAXINT,
когда находит первую незанятую, записывает туда z.*/
for (--end; mas[end].name[0] != '\0'; --end)
if (end < 0) throw(ErrOverFlow()); // переполнение
//AddABC(z, end);
ABC[size] = end;
mas[end] = z;
mas[k].link = end;
size++;
return -1; //вставка в конец
}
//------------------------------------------------------------------------------------------------------------------------------------------------------
int Ident::Search (elem el) //возвращает номер найденной записи
{
for(int i = 0; i < size; ++i)
{
if (!strcmp(mas[ABC[i]].name, el.name)) return i;
}
throw ErrSearch();
}
//------------------------------------------------------------------------------------------------------------------------------------------------------
Void Ident::Delete(elem el)
{
int nom = Search(el);
//mas[ABC[nom]].name[0] = MAXINT;
mas[ABC[nom]].link = -1;
mas[ABC[nom]].name[0] = '\0';
for (int i = nom; i < size; ++i)
{
ABC[i] = ABC[i + 1];
}
--size;
}
#pragma package(smart_init)
Stack_mass.H
#ifndef Stack_massH
#define Stack_massH
#define MAXSIZE 1000
class ErrEmptyStack {}; //попытка взять элемент из пустого стека
template <class TYPE>
class Stack //стек на основе массива
{
private:
TYPE Mas[MAXSIZE];
int top;
public:
Stack () {top = -1;}
inline void push (TYPE a) {Mas[++top] = a;} //вставить
inline TYPE pop () {if (top > -1) return Mas[top--]; throw ErrEmptyStack(); }//удалить
inline int Size() {return top + 1;} //размер
inline TYPE& operator [] (int i) {if (i <= top) return Mas[i];}
};
#endif
