Cod sursa(job #760313)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 20 iunie 2012 22:27:32
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb

#include <fstream>

static const unsigned int HASH_KEY(666013);

inline unsigned int hash (unsigned int number)
{
    return number % HASH_KEY;
}

struct list_element
{
    unsigned int value;
    struct list_element *next;
};

struct list_element *table [HASH_KEY];

inline bool search_hash (const unsigned int number)
{
    struct list_element *it(table[hash(number)]);
    while (it)
        if (it->value == number)
            return true;
        else
            it = it->next;
    return false;
}

inline void hash_add (const unsigned int number)
{
    if (search_hash(number))
        return;
    struct list_element *new_element(new struct list_element);
    new_element->value = number;
    new_element->next = table[hash(number)];
    table[hash(number)] = new_element;
}

inline void hash_remove (const unsigned int number)
{
    struct list_element *it(table[hash(number)]);
    if (it)
    {
        if (it->value == number)
        {
            table[hash(number)] = it->next;
            delete it;
            return;
        }
        struct list_element *previous;
        while (true)
        {
            previous = it;
            it = it->next;
            if (it)
            {
                if (it->value == number)
            {
                    previous->next = it->next;
                    delete it;
                    return;
                }
            }
            else
                break;
        }
    }
}

int main (void)
{
    unsigned int data_size;
    std::ifstream input("hashuri.in");
    input >> data_size;
    char operation;
    unsigned int number;
    std::ofstream output("hashuri.out");
    do
    {
        input >> operation >> number;
        if (operation == '1')
            hash_add(number);
        else if (operation == '2')
            hash_remove(number);
        else
        {
            if (search_hash(number))
                output.put('1');
            else
                output.put('0');
            output.put('\n');
        }
        --data_size;
    }
    while (data_size);
    input.close();
    output.close();
    return 0;
}