Cod sursa(job #2191484)

Utilizator felipeGFilipGherman felipeG Data 2 aprilie 2018 21:19:39
Problema Hashuri Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.85 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MOD 111111
typedef struct node
{
    int key;
    struct node *next;
}NodeT;

int Hash( int x )
{
    return x % MOD;
}

int Search( NodeT * hTable[ MOD ], int x )
{
    for ( NodeT * i = hTable[ Hash( x ) ]; i; i = i->next )
        if ( i->key == x )
            return 1;
    return 0;
}

void Insert( NodeT * hTable[ MOD ], int x )
{
    int find = Search( hTable, x );

    if ( find == 0 )
    {
        NodeT * p = ( NodeT * )malloc( sizeof( NodeT ) );
        p->next = hTable[ Hash( x ) ];
        p->key = x;
        hTable[ Hash( x ) ] = p;
    }
}

void Delete( NodeT * hTable[ MOD ], int x )
{
    int find = Search( hTable, x );

    if ( find == 1 )
    {
        int KEY = Hash( x );
        NodeT * prev = NULL;
        NodeT * p = hTable[ KEY ];

        while ( p->next && p->key != x )
        {
            prev = p;
            p = p->next;
        }

        if ( prev == NULL )
        {
            if ( p->next )
                hTable[ KEY ] = p->next;
            else
                 hTable[ KEY ] = NULL;
        }
        else
            prev->next = p->next;

        free( p );
    }
}

int main()
{
    NodeT * hTable[ MOD ];
    int i;
    FILE * fin = fopen( "hashuri.in", "r" );
    FILE * fout = fopen( "hashuri.out", "w" );
    for ( i = 0; i < MOD; ++ i )
        hTable[ i ] = NULL;

    int n, s, key;
    fscanf( fin, "%d", &n );
    for ( i = 0; i < n; i ++ )
    {
        fscanf( fin, "%d %d", &s, &key );

        switch ( s )
        {
            case 1:{Insert( hTable, key );}break;
            case 2:{Delete( hTable, key );}break;
            case 3:{fprintf(fout, "%d\n", Search( hTable, key ));}break;
        }

    }

    fclose( fin );
    fclose( fout );

    return 0;
}