#Makefile para compilar todos los modulos
all: primers llistat.o: llistat.c llistat.h gcc - c llistat.c primers.o:llistat
.o primers.c gcc - c primers.c primers:llistat.o pr
imers.o gcc primers.o llistat.o - o primers
/****************************llistat.c**************************/
#include "llistat.h"
llistat LLISTAT_Crea()
{
//funcion que inicializa la estructura LLISTAT
llistat ll;
ll.pri = NULL;
ll.pdi = NULL;
ll.ult = NULL;
return ll;
}
llistat LLISTAT_Insereix(llistat ll, int num)
{
//funcion que annade un numero al final del listado
node *aux;
//definimos el puntero a la nueva estructura
aux = (node *) malloc(sizeof(node));
//pedimos memoria para la estructura
if (aux != NULL) {
aux->num = num;
//ponemos en el campo num el numero a annadir
aux->ps = NULL;
//como annadimos siempre al final, hacemos que no
//apunte en ningun sitio
if (ll.pri == NULL) {
//tenemos de actuar diferente si es el primer numero
//que annadimos o no lo es
ll.pri = aux;
ll.ult = aux;
ll.pdi = aux;
//y todos los punteros al unico numero
} else {
ll.ult->ps = aux;
//el que era ultimo, hacemos que apunte al nuevo
//ultimo
ll.ult = aux;
//y el puntero a ultimo que apunte al nuevo
//ultimo
}
} else {
printf("Error pidiendo memoria\n");
exit(0);
}
return ll;
//devolvemos la lista nueva modificada
}
int LLISTAT_Consulta(llistat ll)
{
return (ll.pdi->num);
//devolvemos el numero apuntado por pdi
}
int LLISTAT_esFi(llistat ll)
{
return (ll.pdi->ps == NULL);
//estamos en el ultimo numero si el puntero a siguiente
//no apunta a ningun sitio
}
llistat LLISTAT_VesAlPrincipi(llistat ll)
{
ll.pdi = ll.pri;
//hacemos que "punto de interes" sea el principio
}
llistat LLISTAT_Avanca(llistat ll)
{
ll.pdi = ll.pdi->ps;
//avanzamos uno, si podemos -si estamos al final ll.pdi
//apuntara a NULL!! -> un poco incorrecto
return ll;
}
/*********************************llistat.h**********************/
#ifndef LLI_
#define LLI_
#include <stdlib.h>
#include <stdio.h>
struct node_ {
int num;
struct node_ *ps;
};
typedef struct node_ node;
//hacemos estructura node
typedef struct {
node *pri;
node *pdi;
node *ult;
} llistat;
//y tendremos como un listado para guardar los numeros
llistat LLISTAT_Crea();
llistat LLISTAT_Insereix(llistat ll, int num);
llistat LLISTAT_VesAlPrincipi(llistat ll);
llistat LLISTAT_Avanca(llistat ll);
int LLISTAT_Consulta(llistat ll);
int LLISTAT_esFi(llistat ll);
void LLISTAT_Destrueix(llistat ll);
#endif
/********************************primers.c************************/
#include "llistat.h"
int esPrimer(int c, llistat ll);
int main()
{
int comprova;
llistat ll;
ll = LLISTAT_Crea();
//iniciamos la lista
ll = LLISTAT_Insereix(ll, 2);
//inserimos el numero 2
ll = LLISTAT_VesAlPrincipi(ll);
//vamos al principio
printf("2-");
//escrivimos el 2 en pantalla
comprova = 3;
//empezamos a atacar con el numero 3
while (comprova < 2000000) {
//mientras estemos comprobando numeros menores de 2000000
//seguimos comprobando
if (esPrimer(comprova, ll)) {
//si el numero ha sido primero, lo escrivimos
//en pantalla y lo annadimos en la lista
printf("%d-", comprova);
ll = LLISTAT_Insereix(ll, comprova);
}
comprova = comprova + 2;
//avanzamos dos, asi nos saltamos los numeros pares
}
return 1;
}
int esPrimer(int c, llistat ll)
{
//esta funcion nos devuelve 1 si el numero es primero y 0
//si no lo es
int ret;
ret = 1;
//suponemos que es primero, si conseguimos demostrar que no lo
//es pues ya devolveremos 0
ll = LLISTAT_VesAlPrincipi(ll);
//vamos al principio para hacer las comprobaciones
while (ret && !LLISTAT_esFi(ll)
&& LLISTAT_Consulta(ll) * LLISTAT_Consulta(ll) <= c + 1) {
/*Seguiremos comprobando mientras:
-sea primero (si no lo es devolvemos que no loes)
-no lleguemos al final del listado (precindible seguramente
con la siguiente condicion)
-estemos comprobando numeros menores de la raiz cuadrada
del numero que estemos atacando
*/
if (c % LLISTAT_Consulta(ll) == 0) {
ret = 0;
//si la division da exacto, no es primero!
} else {
ll = LLISTAT_Avanca(ll);
//no ha sido primero, avanzamos en la lista
//(tambien podriamos hacerlo fuera del else)
}
}
return ret;
//devolvemos la verdad sobre el numero
}