Está en la página 1de 8

LISTAS HASH

FILE *fdd, *fdc;


struct enc_datos{
int nrs;
}ed;
struct reg_datos{
char nom[20];
int nr;
int sr;
bool estado;
}rd,s;
struct enc_col{
int nrs;
}ec;
struct reg_col{
char nom[20];
int nr;
int sr;
bool estado;
}rc,c;
int
int
int
int

led = sizeof(struct enc_datos);


lrd = sizeof(struct reg_datos);
lec = sizeof(struct enc_col);
lrc = sizeof(struct reg_col);

int fh(char nom[]){


int cont=0;
for(int i=0;i<strlen(nom);i++){
if(i%2){
cont=cont-nom[i];
}else{
cont=cont+nom[i];
}
}
if(cont<0){
cont=cont*-1;
}
//ahora falta sacar el mdulo.
cont=cont%10;
cont++;
cout<<"El nr es: "<<cont<<endl;
return cont;
}

void escribir(){
int pos,op;
cout<<"\nESCRIBIR ARCHIVO";
if((fdd=fopen("file.txt","w+"))==NULL){
return;
}
if((fdc=fopen("file.col","w+"))==NULL){

return;
}
ed.nrs=0;
ec.nrs=0;
int sgte;
do{
cout<<"\n\nIngrese nombre: ";
fflush(stdin); gets(rd.nom);
int nr=fh(rd.nom);
fseek(fdd,0,0);
fread(&ed,1,led,fdd);
rd.nr=nr;
rd.estado=true;
pos=(nr-1)*lrd+led;
fseek(fdd,pos,0);
//falta guardar el ed.nrs ++
fread(&s,1,lrd,fdd); //leo a ver si hay algo.
if(s.nr==nr){
//si el nr es igual, me voy al registro de colisiones
sgte=s.sr;
//veo que registro le sigue a mi puntero que esta en el reg.txt
if(sgte==-1){ //si ese siguiente es -1, significa que en el col no hay ninguna
colision an
cout<<"\n\tEn lista de colisiones, luego del disperso.\n";
fseek(fdc,0,0);
fread(&ec,1,lec,fdc);
pos=(ec.nrs)*lrc+lec;
rd.nr=++ec.nrs;
//el ec.nrs aumenta
rd.sr=-1;
//es el ultimo
s.sr=rd.nr;
//el sr en el txt cambia y ahora apunta a nr
fseek(fdc,pos,0);
//accedo a la posicin ltima sin llenar y guardo
fwrite(&rd,1,lrc,fdc); //guardo mi registro, ahora falta guardar mi registro
anterior que es el s.
pos=(s.nr-1)*lrd+led;
//ahora debo guardar el puntero "s"
fseek(fdd,pos,0);
fwrite(&s,1,lrd,fdd); //se guarda el nuevo sr del registro en el archivo de
texto
}else{ //accedo al siguiente en el registro de colisiones
cout<<"\n\tEN la lista de colisiones, en lista de dispersos.\n";
fseek(fdc,0,0);
fread(&ec,1,lec,fdc);
while(sgte!=-1){
pos=(sgte-1)*lrc+lec;
//leo el siguiente registro en el archivo
de colisiones
fseek(fdc,pos,0);
fread(&c,1,lrc,fdc); //una vez ledo, lo guardo en mi registro c
sgte=c.sr;
}//cuando el siguiente sea -1, significa que ahi debo meter a mi registro
nuevo
rd.nr=++ec.nrs;
rd.sr=-1;
c.sr=rd.nr;
//ahora guardare el c
pos=(c.nr-1)*lrc+lec;
fseek(fdc,pos,0);
fwrite(&c,1,lrc,fdc);
pos=(rd.nr-1)*lrc+lec;
fseek(fdc,pos,0);
//guardo mi registro en la posicion
correspondiente
fwrite(&rd,1,lrc,fdc);

}
//como guarde en mi registro de colisiones, actualizo su cabecera
fseek(fdc,0,0);
fwrite(&ec,1,lec,fdc);
}else{
//si no est dentro de mi registro de datos, lo ingreso ahi
cout<<"\n\tEn lista de dispersos\n";
fseek(fdd,pos,0);
//la posicion esta guardada ya ahora falta guardar
ed.nrs++;
//este debe crecer
rd.sr=-1;
fwrite(&rd,1,lrd,fdd); //guardo el registro
fseek(fdd,0,0);
fwrite(&ed,1,led,fdd);
//actualizado el puntero
}
cout<<"\n\n\tDesea ingresar otro registro? (0/1): ";
cin>>op;
}while(op==1);
fclose(fdd);
fclose(fdc);
cout<<"\n\nFINALIZADO...";
}
void verOrdenado(){
if((fdd=fopen("file.txt","r"))==NULL)
return;
if((fdc=fopen("file.col","r"))==NULL)
return;
int cont=0;
cout<<"\n***********ARCHIVO DISPERSO***********\n";
fread(&ed,1,led,fdd);
cout<<"\nNumero de registros: "<<ed.nrs;
cout<<endl; system("pause>0"); cout<<endl<<endl;
while(!feof(fdd)){
fread(&rd,1,lrd,fdd);
if(rd.nr!=NULL){
cout<<"\nNumero de registro: "<<rd.nr;
cout<<"\nNombre: "<<rd.nom;
cout<<"\nS.R.: "<<rd.sr;
cout<<"\nEstado: "<<rd.estado;
cout<<endl;
cont++;
}else{
cout<<"\n";
continue;
}
if(cont==ed.nrs) break;
}
cout<<endl;
system("pause>0");
cout<<endl;
cout<<"\n***********ARCHIVO DE COLISIONES***********\n";
fread(&ec,1,lec,fdc);
cout<<"\nNumero de registros: "<<ec.nrs;
cout<<endl; system("pause>0"); cout<<endl<<endl;
for(int i=0;i<ec.nrs;i++){
fread(&rc,1,lrc,fdc);
cout<<"\nNumero de registro: "<<rc.nr;
cout<<"\nNombre: "<<rc.nom;
cout<<"\nS.R.: "<<rc.sr;
cout<<"\nEstado: "<<rc.estado;

cout<<endl;
}
fclose(fdd);
fclose(fdc);
}
void buscar(){
char nombre[20];
bool bandera;
if((fdd=fopen("file.txt","r"))==NULL)
return;
if((fdc=fopen("file.col","r"))==NULL)
return;
cout<<"BUSQUEDA DE REGISTROS";
cout<<"\nIngrese nombre a buscar: ";
fflush(stdin); gets(nombre);
int nr=fh(nombre);
int pos=(nr-1)*lrd+led;
fseek(fdd,pos,0);
fread(&rd,1,lrd,fdd);
if(nr!=rd.nr){ //no esta en la lista de dispersos
cout<<"\n\nEL REGISTRO NO EXISTE EN NINGUN LUGAR DEL ARCHIVO.";
return;
}else{ //hay archivos en esa posicion
if(strcmp(rd.nom,nombre)==0){ //el registro esta en dispersos nomas
cout<<"\n\nEL REGISTRO SE ENCONTRO EN LA LISTA DE DISPERSOS";
cout<<"\nNombre: "<<rd.nom;
cout<<"\nN.R.: "<<rd.nr;
cout<<"\nS.R.: "<<rd.sr;
}else{
int sgte=rd.sr;
if(sgte==-1){ //no hay ni en el de colisiones
cout<<"\n\nEL REGISTRO NO EXISTEN EN COLISIONES.";
}else{
bandera=false;
while(sgte!=-1){
pos=(sgte-1)*lrc+lec;
fseek(fdc,pos,0);
fread(&c,1,lrc,fdc);
if(strcmp(c.nom,nombre)==0){
cout<<"\n\nEL REGISTRO SE ENCONTRO EN LA LISTA DE
COLISIONES";
cout<<"\nNombre: "<<c.nom;
cout<<"\nN.R.: "<<c.nr;
cout<<"\nS.R.: "<<c.sr;
bandera=true;
break;
}
sgte=c.sr;
}
if(bandera==false){
cout<<"\n\nEL REGISTRO NO SE ENCONTRO NI SIQUIERA EN LA
LISTA DE COLISIONES";
}else{
return;
}
}
}
}
fclose(fdd);

fclose(fdc);
}
void insertar(){
//LA INSERCION ES SIN REEMPLAZAR LO ELIMINADO.
if((fdd=fopen("file.txt","r+"))==NULL)
return;
if((fdc=fopen("file.col","r+"))==NULL)
return;
cout<<"\nINSERTAR REGISTRO\n";
cout<<"\n\nIngrese nombre: ";
fflush(stdin); gets(rd.nom);
int nr=fh(rd.nom);
fread(&ed,1,led,fdd);
int pos=(nr-1)*lrd+led;
fseek(fdd,pos,0);
fread(&s,1,lrd,fdd);
if(s.nr==nr){
int sgte=s.sr;
if(sgte==-1){
cout<<"\n\tEn lista de colisiones, luego del disperso.\n";
fseek(fdc,0,0);
fread(&ec,1,lec,fdc);
pos=(ec.nrs)*lrc+lec;
rd.nr=++ec.nrs;
rd.sr=-1;
s.sr=rd.nr;
fseek(fdc,pos,0);
//accedo a la posicin ltima sin llenar y guardo
fwrite(&rd,1,lrc,fdc); //guardo mi registro, ahora falta guardar mi registro anterior
que es el s.
pos=(s.nr-1)*lrd+led;
//ahora debo guardar el puntero "s"
fseek(fdd,pos,0);
fwrite(&s,1,lrd,fdd); //se guarda el nuevo sr del registro en el archivo de texto
}else{
cout<<"\n\tEN la lista de colisiones, en lista de dispersos.\n";
fseek(fdc,0,0);
fread(&ec,1,lec,fdc);
while(sgte!=-1){
pos=(sgte-1)*lrc+lec;
//leo el siguiente registro en el archivo
de colisiones
fseek(fdc,pos,0);
fread(&c,1,lrc,fdc); //una vez ledo, lo guardo en mi registro c
sgte=c.sr;
}//cuando el siguiente sea -1, significa que ahi debo meter a mi registro
nuevo
rd.nr=++ec.nrs;
rd.sr=-1;
c.sr=rd.nr;
//ahora guardare el c
pos=(c.nr-1)*lrc+lec;
fseek(fdc,pos,0);
fwrite(&c,1,lrc,fdc);
pos=(rd.nr-1)*lrc+lec;
fseek(fdc,pos,0);
//guardo mi registro en la posicion
correspondiente
fwrite(&rd,1,lrc,fdc);
}
fseek(fdc,0,0);
fwrite(&ec,1,lec,fdc);
}else{
cout<<"\n\tEn lista de dispersos\n";

fseek(fdd,pos,0);
//la posicion esta guardada ya ahora falta guardar
ed.nrs++;
//este debe crecer
rd.nr=nr;
rd.sr=-1;
fwrite(&rd,1,lrd,fdd); //guardo el registro
fseek(fdd,0,0);
fwrite(&ed,1,led,fdd);
//actualizado el puntero
}
cout<<"\n\n\nREGISTRO INGRESADO CORRECTAMENTE...\n";
fclose(fdd);
fclose(fdc);
}
void deseliminar(){
char nombre[20];
bool bandera;
if((fdd=fopen("file.txt","r+"))==NULL)
return;
if((fdc=fopen("file.col","r+"))==NULL)
return;
cout<<"DESELIMINACION DE UN REGISTRO";
cout<<"\nIngrese nombre a deseliminar: ";
fflush(stdin); gets(nombre);
int nr=fh(nombre);
int pos=(nr-1)*lrd+led;
fseek(fdd,pos,0);
fread(&rd,1,lrd,fdd);
if(nr!=rd.nr){ //no esta en la lista de dispersos
cout<<"\n\nEL REGISTRO NO EXISTE EN NINGUN LUGAR DEL ARCHIVO.";
return;
}else{ //hay archivos en esa posicion
if(strcmp(rd.nom,nombre)==0){ //el registro esta en dispersos nomas
cout<<"\n\nEL REGISTRO SE ENCONTRO EN LA LISTA DE DISPERSOS";
if(rd.estado==1){
cout<<"\nEL REGISTRO NO ESTABA ELIMINADO";
goto salir;
}
cout<<"\nDeseliminando...";
rd.estado=1;
fseek(fdd,pos,0);
fwrite(&rd,1,lrd,fdd);
cout<<"\n\nREGISTRO DESELIMINADO";
}else{
int sgte=rd.sr;
if(sgte==-1){ //no hay ni en el de colisiones
cout<<"\n\nEL REGISTRO NO EXISTE.";
}else{
bandera=false;
while(sgte!=-1){
pos=(sgte-1)*lrc+lec;
fseek(fdc,pos,0);
fread(&c,1,lrc,fdc);
if(strcmp(c.nom,nombre)==0){
cout<<"\n\nEL REGISTRO SE ENCONTRO EN LA LISTA DE
COLISIONES";
if(c.estado==1){
cout<<"\nEL REGISTRO NO ESTABA ELIMINADO";
goto salir;
}
cout<<"\nEliminando...";

c.estado=0;
fseek(fdc,pos,0);
fwrite(&c,1,lrc,fdc);
cout<<"\n\nREGISTRO DESELIMINADO";
bandera=true;
break;
}
sgte=c.sr;
}
if(bandera==false){
cout<<"\n\nEL REGISTRO NO SE ENCONTRO.";
}
}
}
}
salir:fclose(fdd);
fclose(fdc);
}

void eliminar(){
char nombre[20];
bool bandera;
if((fdd=fopen("file.txt","r+"))==NULL)
return;
if((fdc=fopen("file.col","r+"))==NULL)
return;
cout<<"ELIMINACION DE UN REGISTRO";
cout<<"\nIngrese nombre a eliminar: "; fflush(stdin); gets(nombre);
int nr=fh(nombre);
int pos=(nr-1)*lrd+led;
fseek(fdd,pos,0);
fread(&rd,1,lrd,fdd);
if(nr!=rd.nr){ //no esta en la lista de dispersos
cout<<"\n\nEL REGISTRO NO EXISTE EN NINGUN LUGAR DEL ARCHIVO.";
return;
}else{ //hay archivos en esa posicion
if(strcmp(rd.nom,nombre)==0){ //el registro esta en dispersos nomas
cout<<"\n\nEL REGISTRO SE ENCONTRO EN LA LISTA DE DISPERSOS";
if(rd.estado==0){
cout<<"\nEL REGISTRO YA ESTABA ELIMINADO";
goto salida;
}
cout<<"\nEliminando...";
rd.estado=0;
fseek(fdd,pos,0);
fwrite(&rd,1,lrd,fdd);
cout<<"\n\nREGISTRO ELIMINADO";
}else{
int sgte=rd.sr;
if(sgte==-1){ //no hay ni en el de colisiones
cout<<"\n\nEL REGISTRO NO EXISTE.";
}else{
bandera=false;
while(sgte!=-1){
pos=(sgte-1)*lrc+lec;
fseek(fdc,pos,0);
fread(&c,1,lrc,fdc);
if(strcmp(c.nom,nombre)==0){

cout<<"\n\nEL REGISTRO SE ENCONTRO EN LA LISTA DE


COLISIONES";
if(c.estado==0){
cout<<"\nEL REGISTRO YA ESTABA ELIMINADO";
goto salida;
}
cout<<"\nEliminando...";
c.estado=0;
fseek(fdc,pos,0);
fwrite(&c,1,lrc,fdc);
cout<<"\n\nREGISTRO ELIMINADO";
bandera=true;
break;
}
sgte=c.sr;
}
if(bandera==false){
cout<<"\n\nEL REGISTRO NO SE ENCONTRO.";
}
}
}
}
salida:fclose(fdd);
fclose(fdc);
}

También podría gustarte