Cod sursa(job #755211)

Utilizator zseeZabolai Zsolt zsee Data 4 iunie 2012 23:31:14
Problema Hashuri Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 2.24 kb

#define m 74729   // nr prim

#define j 17
#define r 2
#define masca 131071
#define y 56391
#define x_const {3423, 10144}


#include <stdio.h>
//#include <conio.h>
#include <stdlib.h>
#include <time.h>


/*
** FUNCTIA HASH
** sursa: UPT, AN I, CTI, P&S Proiectul 2 - 2012
*/
int kk[ r ];
int x[] = x_const;

void cioparteste(unsigned long x, int *k) {
     int i;
     for (i=0; i<r; i++) {
         k[i] = x & masca;
         x = x >> j;
     }
}

int valoare_hash(int *k){
  unsigned long i;   
  int j2;
  i=0;
  for(j2=0;j2<r;j2++) {
      i += k[j2]*x[j2];
  }    
  i+=y;
  return i % m;     
}

int hashvalue( unsigned long z ) {
    int i;
    cioparteste(z,kk);
    i = valoare_hash(kk);
    return i;
}

/*
** END FCTIA HASH
*/

/*
** LISTE INLANTUITE
*/

typedef struct LI {
       struct LI *urm;
       unsigned long x;
} li;

void LI_ad( li *c, unsigned long x ) {
     li *n;
     n = (li *)malloc( sizeof( li ) );
     n->urm = c->urm;
     n->x = x;
     c->urm = n;
}

li *LI_srch( li *c, unsigned long x ) {
     li *p;
     p = c->urm;
     while (p != NULL) {
           if ( p->x == x ) {
              return c;
           }
           c = p;
           p = p->urm;
     }
     return NULL;
}


void LI_del( li *c, unsigned long x ) {
     li *p;
     p = LI_srch( c, x );
     if ( p != NULL ) {
          c = p->urm;
          p->urm = p->urm->urm;
          free(c);
     }
}

li ht[m];
 
int main(void) {   
    
    FILE *fi,*fo;
    fi = fopen("hashuri.in","r");
    fo = fopen("hashuri.out","w");
    int op, no,i,idx;
    unsigned long nr;
    fscanf(fi, "%d", &no);
    
    for (i=0;i<no;i++) {
        fscanf(fi, "%d %u", &op, &nr );
        idx = hashvalue( nr );
        switch (op) {
               case 1:
                    if ( LI_srch( &ht[idx], nr ) == NULL ) {
                       LI_ad( &ht[idx], nr );
                    }
                    break;
               case 2:
                    LI_del( &ht[idx], nr );
                    break;
               case 3:
                    fprintf(fo, "%d\n", (LI_srch( &ht[idx], nr ) == NULL) ? 0 : 1 );
        }
    }
    fclose(fi);
    fclose(fo);
    
    return 0;
}