Buscar este blog

16 de enero de 2010


Códigos sobre arboles  
#include
#include
#include
#include

enum boolean {FALSE, TRUE};

typedef struct _primos{  //Así lo puedo referenciar aquí dentro
  unsigned long int num;
  struct _primos *siguiente; //Aún no está definido el tipo
  } primos;  //Nombre del nuevo tipo

primos *primero, *ultimo; //Estas son las variables globales

void imprimir_primos ();
void liberar();
boolean esprimo (unsigned long int i);
boolean insertar_primo (unsigned long int x);
void leer_fichero_txt ();
void guardar_fichero_txt();
void menu();
void contar();


void main()
{
unsigned long int i=3, max;
char opcion;
boolean salir = FALSE;
clock_t start, end;
start = clock();


//1 primo//
primero = (primos *) malloc (sizeof (primos));
primero -> siguiente = NULL;
primero -> num = 1;
ultimo = primero;
/////
insertar_primo (2); /*caso raro, para tener referencia*/


do{
//   clrscr(); //No es ANSCI C
   menu();
   fflush (stdin);
   opcion = getc(stdin);

   switch (opcion)
      {
//Esta función la he comentado por no ser ANSIC por el kbhit()//
/*      case '1':   puts ("CALCULANDO...");
   start = clock();

   for (; !kbhit(); i+=2 )
      {
    if (esprimo(i))
       {
       if (!insertar_primo (i)) break;;
       }
      }
   end = clock();
   printf ("\aFINALIZADO\n\nÚltimo nº comprobado:
   %li\nTiempo empleado: %f\nPresiona una tecla para continuar"
   , i, (end-start)/ CLK_TCK);
   fflush(stdin);
   getc(stdin);
      //         break; */

      case '2':   printf ("\n Hasta que numero quieres buscar?  ");
   scanf ("%li", &max);
   puts ("CALCULANDO...");
   start = clock();
   for (; i < max; i=i+2 )
      {
    if (esprimo(i))
       {
       if (!insertar_primo (i)) break;
       }
      }
       end = clock ();
       printf ("FINALIZADO ultimo numero comprobado");
       printf("Presiona una tecla para continuar", i, (end-start) / CLK_TCK);
       fflush(stdin);
       getc(stdin);
       break;
      case '3': leer_fichero_txt (); break;
      case '4': guardar_fichero_txt (); break;
      case '5': imprimir_primos (); break;
      case '6': salir = TRUE; break;
      case '7': contar(); break;
      default : puts ("OPCION INCORRECTA");
      }
  } while (!salir);
liberar();
}


boolean esprimo (unsigned long int i)
{
unsigned long int max;
primos *aux;
max = (long int) (sqrt (i));
//Probamos los menores o igual a la raíz

aux = primero->siguiente; /*apunto al 2*/

while (aux -> num <= max)
//aux no puede ser NULL pq nunca será el último elemento
  {
  if (i % aux -> num == 0) return FALSE;
  aux = aux -> siguiente;
  }
  return TRUE;
}


void imprimir_primos ()
{
primos *aux;
aux = primero;

while (aux -> siguiente != NULL)
  {
  printf ("%5li ",aux->num);
  aux = aux -> siguiente;
  }

getc(stdin);
}


boolean insertar_primo (unsigned long int x)
{
primos *aux;

if ((aux = (primos *) malloc (sizeof (primos)))!=NULL)
//reservo memoria para siguiente primo
   {
   ultimo -> siguiente = aux;      //último apunta al siguiente
   ultimo = aux;                   //último primo es el nuevo
   ultimo -> num = x;              //inserto el número en último
   ultimo -> siguiente = NULL;     //último apunta a NULL
   return TRUE;
   }
else
   {
   printf ("OUT OF MEMORY");
   return (FALSE);
   }
}


void liberar()
{
primos *aux, *ant;
ant = primero;
for (aux = primero->siguiente; aux != NULL; aux = aux->siguiente)
   {
   free (ant);
   ant = aux;
   }
}

void menu()
{
puts ("Menu");
puts ("====n");
//puts ("1-Calcular números primos hasta que presionemos una tecla");
//La opción1 utiliza kbhit que no es ANSIC
puts ("2-Calcular hasta un numero primo");
puts ("3-Cargar fichero de numeros primos");
puts ("4-Guardar primos en fichero");
puts ("5-Imprimir numeros primos calculados hasta el momento");
puts ("6-Salir");
puts ("7-Contar memoria");
}


void leer_fichero_txt ()
{
unsigned long i;
FILE *f;

if ((f = fopen ("primos.txt", "rt")) != NULL)
   {
   fscanf (f, "%li ", &i);
   fscanf (f, "%li ", &i); //as¡ ya he leido hasta el 2
   printf ("Leyendo fichero primos.txt");
   while (!feof(f))
      {
      fscanf (f, "%li ", &i);
      insertar_primo(i);
      }
   printf ("fichero leido Presiona cualquier tecla para continuar");
   fclose(f);

   }
else printf ("ERROR AL ABRIR EL FICHERO");
getc(stdin);
}


void guardar_fichero_txt ()
{
primos *aux;
FILE *f;

if ((f = fopen ("primos.txt", "wt")) != NULL)
   {
   printf ("Guardando primos");
   for (aux = primero; aux != NULL; aux = aux -> siguiente)
      {
      fprintf (f, "%li ", aux -> num);
      }
   printf ("Fichero guardado Presiona cualquier tecla para continuar");
   fclose(f);
   }
else (printf ("ERROR AL GUARDAR EL FICHERO"));
getc(stdin);
}



void contar ()
{

primos *aux;
unsigned long i = 0;

for (aux = primero; aux != NULL; aux = aux -> siguiente)
   {
   i++;
   }

printf ("Hay un total de %li nums primos Ocupan %li * %i bytes = %li bytes", i, i, sizeof(primos),
 i*sizeof(primos));
getc(stdin);
}

No hay comentarios:

Publicar un comentario