Cod sursa(job #304628)

Utilizator utcistuBarcau Tomsa utcistu Data 14 aprilie 2009 22:26:28
Problema Hashuri Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.67 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define nMax 1000001

int hFct(int x,int i)
{
    return (x+i)%nMax;
}

void hInsert(int *hTable,int x)
{
    int i,crt;
    for (i=0;i<nMax;i++)
    {
        crt=hFct(x,i);
        if (hTable[crt]==0)
        {
            hTable[crt]=x;
            break;
        }
        else if (hTable[crt]==x)
        {
            break;
        }
    }
}

void hDelete(int *hTable,int x)
{
    int i,crt;
    for (i=0;i<nMax;i++)
    {
        crt=hFct(x,i);
        if (hTable[crt]==0)
        {
            break;
        }
        else if (hTable[crt]==x)
        {
            hTable[crt]=0;
        }
    }
}

int hFind(int *hTable,int x)
{
    int i,crt;
    for (i=0;i<nMax;i++)
    {
        crt=hFct(x,i);
        if (hTable[crt]==0)
        {
            return 0;
        }
        else if (hTable[crt]==x)
        {
            return 1;
        }
    }
    return 0;
}

int main()
{
    FILE *fin,*fout;
    fin=fopen("hashuri.in","r");
    fout=fopen("hashuri.out","w");
    int i,x,n,*hTable,cmd;
    hTable=(int *)malloc(sizeof(int)*nMax);
    memset(hTable,'\0',sizeof(int)*nMax);
    fscanf(fin,"%d",&n);
    for (i=0;i<n;i++)
    {
        fscanf(fin,"%d %d",&cmd,&x);
        switch (cmd)
        {
            case 1:hInsert(hTable,x);
            break;
            case 2:hDelete(hTable,x);
            break;
            case 3:if (hFind(hTable,x))
            fputs("1\n",fout);
            else
            fputs("0\n",fout);
            break;
            default:
            break;
        }
    }
    fclose(fin);
    fclose(fout);
}