Cod sursa(job #1767686)

Utilizator PinkiePie1189Preoteasa Mircea-Costin PinkiePie1189 Data 29 septembrie 2016 16:34:57
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include<stdio.h>
#define MOD 139721
FILE*fin = fopen("hashuri.in", "r");
FILE*fout = fopen("hashuri.out", "w");
int hash(int x) {
    return x%MOD;
}
struct nod {
    int val;
    nod*next;
};
nod* cap[MOD+1];
void InitLista()
{
    for (int i = 0; i <MOD; i++)
    {
        cap[i]=new nod;
        cap[i]->val = 0;
        cap[i]->next = NULL;
    }
}
void Adauga(int x)
{
    nod* newborn = new nod;
    newborn->val = x;
    newborn->next = cap[hash(x)];
    cap[hash(x)] = newborn;
}
void Sterge(int x)
{
    nod*ptr = cap[hash(x)];
    ptr->val = cap[hash(x)]->val;
    ptr->next = cap[hash(x)]->next;
    if (cap[hash(x)]->val == x)
    {
        cap[hash(x)]->val = 0;
    }//nu pot sterge capul listei,asa ca il fac o fantoma
    while (ptr->next != NULL)
    {
        if ((ptr->next)->val == x)
        {
            nod* deSters = ptr->next;
            ptr->next = ptr->next->next;
            delete deSters;
        }
        ptr = ptr->next;
    }

}
bool Verifica(int x)
{
    nod*ptr = cap[hash(x)];
    ptr->val = cap[hash(x)]->val;
    ptr->next = cap[hash(x)]->next;
    //printf("Verific daca elementul %d este in lista %d cu capul %d\n", x, hash(x),cap[hash(x)]->val);
    while (ptr->next!= NULL)
    {
        if (ptr->val == x)
        {
            //printf("Aici sunt!\n");
            return 1;
        }
        ptr = ptr->next;
    }
    return 0;
}
int main(){
    InitLista();
    int Q;
    int x, type;
    fscanf(fin, "%d", &Q);
    for (int i = 1; i <= Q; i++)
    {
        fscanf(fin, "%d%d", &type, &x);
        switch (type)
        {
        case 1:
            Adauga(x);
            //printf("Am adaugat elementul %d la lista %d\n", x,hash(x));
            break;
        case 2:
            Sterge(x);
            //printf("Am sters elementul %d din lista %d\n", x,hash(x));
            break;
        case 3:
            fprintf(fout, "%d\n", Verifica(x));
            //printf("Am verificat daca elementul %d este in tabel si %s este\n", x,Verifica(x)?"":"nu");
            break;
        }
    }
    return 0;
}