ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 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

30