Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет Л.р.4 ШАВРОВА.docx
Скачиваний:
5
Добавлен:
31.03.2015
Размер:
1.49 Mб
Скачать

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)