febrero 26, 2013

EJEMPLO TABLAHASH ESTUDIANTES


Programa que guarda los datos de estudiantes tomando como campo clave el carnet del estudiante (ej: PE01091 las 2 inicilaes de los apellidos mas ultimos 2 degitos del año de ingreso mas un correlativo) en estructuras de tablas hash*/

#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define size 100

//Estructura que contendra cada celda de la tabla guardando los datos del //estudiante que se introduciran
// por medio del teclado
struct infoalumno
{
       char nombre[50];
       char carnet[10];
       char telefono[9];
       char direccion[50];
       int esAlta;
};
typedef struct infoalumno alumno;

//Declaracion de la tabla hash

struct tipotabla
{
       alumno *tabla[size];
       int elementos;
       double factorcarga;/*declaramos un factor de carga puesto que una tabla hash se vuelve ineficiente cuando sobrepasa el 50% */
};
typedef struct tipotabla tabladispersa;

/* Declaracion de funciones*/

void CrearTabla(tabladispersa *);
void insertar(tabladispersa*, alumno);
alumno *buscar(tabladispersa*, char *);
int eliminar(tabladispersa *, char *);
long transforma(char *);
int direccion(tabladispersa *, char *);
void flush();

main()
{
      int op, res, i, p;
      char clave[50];
      alumno datos, *prt;
      tabladispersa tabla[size], n;
      CrearTabla(tabla);
      system("color 05");
      system("cls");
      while(1)
      {
       
        printf("tt°°°°°°°°°°°°°MENU°°°°°°°°°°°°");
        printf("nSeleccione la operacion a realizar:n");
        printf("nt1.Insertar Elementont2.Buscar un elemento");
        printf("nt3-Eliminar un elementont4-Salirnt");
        scanf("%d",&op);
        switch(op)
        {
          case 1:
               system("cls");
               puts("nNombre del estudiante");
               flush();
               gets(datos.nombre);
               puts("nCarnet del estudiante:");
               flush();
               gets(datos.carnet);
               puts("nNo de telefono del estudiante");
               flush();
               gets(datos.telefono);
               puts("nDireccion del estudiante:");
               flush();
               gets(datos.direccion);
       
               p = direccion(tabla , datos.carnet);
               printf("nnLa clave hash generada es: %dn",p);
               puts("nInsercion exitosa!n");
               insertar(tabla, datos);
          break;
          case 2:
               system("cls");
               puts("nIntroduzca el carnet del estudiante que desea buscar");
               flush();
               scanf("%s",&clave);
               prt = buscar(tabla, clave);
               if(prt)
               {
                 system("cls");
                 puts("ntDatos del estudiante:n");
                 printf("nNombre: %sn",prt->nombre);
                 printf("nCarnet %sn",prt->carnet);
                 printf("nNo de telefono %sn",prt->telefono);
                 printf("nDireccion: %sn",prt->direccion);
             
               }
               else
                 puts("nNo existe ese estudiante en este registronn");
          break;
          case 3:
               system("cls");
               puts("nDigite el dato a eliminar de la tabla:");
               flush();
               scanf("%s",&clave);
               i = eliminar(tabla, clave);
               if(i!=1)
               puts("nEliminacion con exiton");
               else
               puts("nError en la eliminacionn");
          break;
          case 4:
               exit(0);
          break;
        }
      }
      getch();
      return 0;
}
/* Crea una tabla hash para trabajar */

void CrearTabla(tabladispersa *t)
{
     int j;
     for(j=0;j<size;j++)
     {
          t->tabla[j] == NULL;
     }
     t->elementos = 0;
     t->factorcarga = 0.0;
}
/* transforma los caracteres de la clave en valores enteros*/
long transforma(char *clave)
{
     int j;
     long d = 0;
     for(j=0;j<strlen(clave);j++)
     {
       d = d * 27 + clave[j];
     }
return ((d>=0) ? d: -d);

/* dirección recibe la tabladispersa y la clave para colocar esta ultima en la tabla*/
}
int direccion(tabladispersa *t, char *clave)
{
    int i=0;
    long p, d;
    d = transforma(clave);
    p = d % size;
    while(t->tabla[p] != NULL && strcmp(t->tabla[p]->carnet, clave) !=0)
    {
      i++;
      p = p + i * i;
      p = p % size;
    }
return (int)p;
}
/* Inserta los datos que representa la clave en la tabla hash*/
void insertar(tabladispersa *t, alumno r)
{
     alumno *pr;
     int posicion;
     pr = (alumno*)malloc(sizeof(alumno));
     strcpy(pr->nombre, r.nombre);
     strcpy(pr->carnet, r.carnet);
     strcpy(pr->telefono, r.telefono);
     strcpy(pr->direccion, r.direccion);
     pr->esAlta = 1;
     posicion = direccion(t, r.carnet);
     t->tabla[posicion] = pr;
     t->elementos++;
     t->factorcarga=(t->elementos)/size;
     if(t->factorcarga > 0.5)
     {
       puts("nFactor de Carga supera el 50% de la tabla");
     }
}
/* Busca el elemento en la tabla e imprime si lo encuentra o no */
alumno *buscar(tabladispersa *t, char *clave)
{
       alumno *pr;
       int posicion;
       posicion = direccion(t, clave);
       pr = t->tabla[posicion];
       if(pr != NULL)
       {
             if(!(pr->esAlta))
             {
                 pr = NULL;
             }
       }
return pr;
}
/* Elimina el elemento de la tabla hash */
int eliminar(tabladispersa *t, char * clave)
{
     int posicion;
     posicion = direccion(t, clave);
     if(t->tabla[posicion] !=NULL)
     {
       t->tabla[posicion] -> esAlta = 0;
     }
     else
       return 1;
}
void flush()
{
     fflush(stdin);
     fflush(stdout);

No hay comentarios:

Publicar un comentario