Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
69
Добавлен:
08.07.2017
Размер:
6.14 Кб
Скачать
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
 
//---------------------------------------------------------------------------
 
#pragma argsused
 
struct link//Список значений
{
        char* value;
        link* next;
};
 
class dict // класс, представл¤ющий собой словарь
{
private:
    link** spisok;//Массив списков класса dict
    int Hash(char* value);//Функция вычисления хэша
 
public:
    dict();//Конструктор
    link* Find(char* value);
    void Insert(char* value);
    bool Delete(char* value);
    ~dict();//Деструктор
};
 
void SearchV(dict* sp);
void InsertV(dict* sp);
void DeleteV(dict* sp);
 
const int maxstrlen = 100;
 
dict::dict() // конструктор
{
    this->spisok = new link*[256];
    for (int i = 0; i < 256; i++)
    {
        this->spisok[i] = NULL;
    }
}
 
int dict::Hash(char* value) // хеш-функци¤
{
    //Хэш - код первого символа в значении
    //Основные коды символов в ASCII таблице 0-255 включительно, поэтому скорее всего не выйдем за пределы массива
    return value[0];
}
 
link* dict::Find(char* value) // метод поиска строки в словаре
{
    //Получаем i-ый список в массиве списков(лучше Hash(value)%256), т.к. есть символы которые выходят из этого диапазона
    link* rez = spisok[Hash(value)];
    if (rez)//если ссылка на rez не равна 0((т.е. не NULL)т.к. 0 в приведении к bool это false)
    {
        while (strcmp(rez->value, value) != 0)//значение в списке не равно переданному значению(сравнение по строкам)
        {
            if (rez->next)//Если существует следующий элемент, то переходим на него
            {
                rez = rez->next;
            }
            else//Иначе выходим из цикла(т.е. дошли до последнего элемента в списке)
            {
                break;
            }
        }
        if (strcmp(rez->value, value) == 0)//Если значение текущего элемента в списке равно переданному, то возвращаем этот элемент
        {
            return rez;
        }
       
    }
    //Во всех остальных случаях возвращаем NULL
   
    return NULL;
}
 
void dict::Insert(char* value) // метод вставки строки в словарь
{
    int hash = Hash(value);//Вычисляем хэш
    link* current = spisok[hash];//Получаем список из массива списков
    if (current)//Если он не пустой
    {
        while (current->next)//Идём в конец массива
        {
            current = current->next;
        }
        //Создаем новый элемент списка и задаём ему значение
        current->next = new link();
        current->next->value = value;
    }
    else
    {
        //Иначе просто создаём новый элемент списка(задаём ему значение), и делаем его первым в массиве списков с текущем хэшом
        current = new link();
        current->value = value;
        spisok[hash] = current;
    }
}
bool dict::Delete(char* value) // удаление элемента
{
    int hash = Hash(value);
    link* current = spisok[hash];
    //Возвращаем true если элемент удалён, иначе false
    if (current)
    {
        link* prev = current;
        //Получение предыдущего элемента перед, элементом с переданным значением
        while (current->next && strcmp(current->next->value, value) != 0)
        {
            prev = current;
            current = current->next;
        }
        //Если у текущего элемента существуют значения
        if (current->value)
        {
            //Если у текущего элемента есть следующий элемент
            if (current->next)
            {
               
                //Если значение следующего элемента равно переданному, то выкидываем его из списка
                if (strcmp(current->next->value, value) == 0)
                {
                    link* next = current->next->next;
                    current->next = next;
                    return true;
                }
            }
            //Если нету следующего элемента
            else
            {
                //Если мы вначале списка
                if (current == spisok[hash])
                {
                    //Выкидываем список
                    spisok[hash] = NULL;
                }
                //Иначе если существует предыдущий
                else if (prev)
                {
                    //То удаляем текущий
                    prev->next = NULL;
                    current = NULL;
                }
                return true;
            }
        }
    }
    return false;
}

dict::~dict()//Деструктор
{
    //Освобождаем память от массива списков
    delete[] spisok;
}
int main(int argc, char* argv[])
{
        dict spisok = dict();
        while (1)
        {
	        cout << endl << "Dejstvie: " << endl;
	        cout << "1) Search" << endl;
	        cout << "2) Insert" << endl;
	        cout << "3) Delete" << endl;
	        cout << "4) Exit" << endl;
	        int value = 0;
	        cin >> value;
	        cout << endl;
	        switch (value)
	        {
		        case 1: SearchV(&spisok); break;
		        case 2: InsertV(&spisok); break;
		        case 3: DeleteV(&spisok); break;
		        case 4: return 0;
	        }
        }
}

void SearchV(dict* sp)
{
        char* input = new char[maxstrlen];
	cout << "Vvedite znachenie" << endl;
	cin >> input;
	link* value = sp->Find(input);
	if (value)
	{
		cout << "Element najden" << endl;
	}
	else
	{
		cout << "Element ne najden" << endl;
	}

}
void InsertV(dict* sp)
{
	char* input = new char[maxstrlen];
	cout << "Vvedite znachenie" << endl;
	cin >> input;
	sp->Insert(input);
	cout << "Element dobavlen" << endl;
}
void DeleteV(dict* sp)
{
	char* input = new char[maxstrlen];
	cout << "Vvedite znachenie" << endl;
	cin >> input;
	if (sp->Delete(input))
	{
		cout << "Element udalen" << endl;
	}
	else
	{
		cout << "Element ne najden" << endl;
	}
}
//---------------------------------------------------------------------------
Соседние файлы в папке lab2
  • #
    08.07.201798 б68Project2.bpf
  • #
    08.07.20173.54 Кб68Project2.bpr
  • #
    08.07.2017876 б68Project2.res
  • #
    08.07.2017196.61 Кб68Project2.tds
  • #
    08.07.20173.5 Кб67Project2.~bpr
  • #
    08.07.20176.14 Кб69Unit1.cpp
  • #
    08.07.2017160.11 Кб69Unit1.obj
  • #
    08.07.20173.78 Кб67Unit1.~cpp