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