Cod sursa(job #611879)

Utilizator andreioneaAndrei Onea andreionea Data 4 septembrie 2011 03:18:30
Problema Hashuri Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.52 kb
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MODULO 200000
#define HASH(x) (x)%MODULO
#define infile "hashuri.in"
#define outfile "hashuri.out"
typedef struct NODE{
		struct NODE *next;
		int data;
	}NODE;
void add(NODE *x, int number)
{
	NODE *a = x;
	while(a->next && (a->next->data <= number)){
		if(a->next->data == number)
			return;
		a = a->next;
	}
	NODE *newNode = (NODE*)malloc(sizeof(NODE));
	newNode->next = a->next;
	newNode->data = number;
	a->next = newNode;
}	
void rem(NODE *x, int number)
{
	NODE *a = x;
	NODE *b;
	while(a->next){
		if(a->next->data == number){
			b = a->next;
			a->next = a->next->next;
			free(b);
			return;
		}
		if(a->next->data > number)
			return;
		a = a->next;
	}
}
int exists(NODE *x, int number)
{
	NODE *a = x;
	while(a->next){
		if(a->next->data == number)
			return 1;
		else if(a->next->data > number)
			return 0;
		a = a->next;
	}
	return 0;
}
int main()
{
	NODE *table[MODULO];
	int i;
	int N;
	FILE *f, *g;
	
	f = fopen(infile,"r");
	g = fopen(outfile,"w");
	for(i = 0; i<MODULO; ++i){
		table[i] = (NODE*)malloc(sizeof(NODE));
		table[i]->next = NULL;
	}
	fscanf(f,"%d",&N);
	for(i = 0; i<N; ++i){
		int op, nr;
		fscanf(f,"%d%d",&op,&nr);
		switch(op){
		case 1:
			add(table[HASH(nr)], nr);
			break;
		case 2:
			rem(table[HASH(nr)], nr);
			break;
		case 3:
			fprintf(g,"%d\n",exists(table[HASH(nr)], nr));
			break;
		default:
			return 1;
		}
	}
	
	fclose(f);
	fclose(g);
	return 0;
}