Pagini recente » Cod sursa (job #402547) | Cod sursa (job #3145115) | Cod sursa (job #2344786) | Cod sursa (job #152162) | Cod sursa (job #709174)
Cod sursa(job #709174)
#include<stdio.h>
#include<iostream>
#include<math.h>
#define subunitar 0.618 // aproximarea numarului sugerat de Donald Knuth
#define m 1048576 // pow(2,18)
#define POSITIVE(a) (a>=0) ? a : a+m
using namespace std;
FILE *in,*out;
typedef struct nod {int info;
nod *back,*next;}NOD;
NOD *v[m],*p,*r;
int a,b,x;
inline int hash(int x) // functie hash bazata pe metoda inmultirii
{
//return (int)( m * ( x*subunitar-(int)(x*subunitar) ) );
//int position=(int)( m * ( x*subunitar-(int)(x*subunitar) ) );
//return position>=0 ? position : position+prim;
//return POSITIVE(position);
return x%m;
//return (x+(m*3)/7)%m; // trebuie rezolvate coliziunile with chaining
}
/*
int hash_alqrainy(int x) // le ia consecutive ,so not
{
int position=(x+(m*3)/7)%m;
return POSITIVE(position);
}*/
void insert()
{
int k=0;
p=v[x];
while(p!=NULL&&k==0)
{
if(p->info==b)
k=1;
p=p->next;
}
if(k==0) // elementul care trebuie inserat nu se gaseste in hash
{
if(v[x]==NULL) // daca lista care incepe de la hash[x] e vida
{
v[x]=new NOD;
v[x]->info=b;
v[x]->next=NULL;
v[x]->back=NULL;
}
else
{
p=v[x];
while(p->next!=NULL)
p=p->next;
NOD *r;
r=new NOD;
r->info=b;
r->next=NULL;
r->back=p;
p->next=r;
}
}
}
void delete_value()
{
int k=0; // pointerul r este mereu cu un pas in urma lui p
p=v[x];
while(p!=NULL&&k==0)
{
if(p->info==b)
k=1;
r=p;
p=p->next;
}
if(k==1) // elementul care trebuie sters se gaseste in lista v[x]
{
if(r==v[x]) // daca elementul care trebuie sters este primul element din lista v[x]
{
NOD *s;s=v[x];
v[x]=v[x]->next;
if(v[x]!=NULL)
v[x]->back=NULL;
delete s;
}
else
{
p=r->back;
p->next=r->next;
if(r->next!=NULL)
r->next->back=p;
delete r;
}
}
}
void search_value()
{
int k=0;
p=v[x];
while(p!=NULL&&k==0)
{
if(p->info==b)
k=1;
p=p->next;
}
fprintf(out,"%d\n",k);
}
int main()
{
int N,i,k;
in=fopen("hashuri.in","r");
out=fopen("hashuri.out","w");
fscanf(in,"%d",&N);
for(i=0;i<m;i++)
v[i]=NULL;
for(i=1;i<=N;i++)
{
fscanf(in,"%d %d",&a,&b);
x=hash(b);
if(a==1)
insert();
else
if(a==2)
delete_value();
else
if(a==3)
search_value();
}
fclose(in);
fclose(out);
return 0;
}