Hallo,
ich habe folgendes Programm welches von einer Folge von n-Zahlen
(1,2,....,n) die Primzahlen bestimmt. Das Programm arbeitet mit einer
lineraren Liste.
Warum kommt nachdem er eine Zahl gelöscht hat, z.B. folgender Output:
1 2 3 0 5 ....
und nicht
1 2 3 5 ....
Danke!
Gruß
Boris
-----------------------------------------------------------------
#include
typedef struct liste_el{
int wert;
struct liste_el *next;
} liste_el;
typedef struct liste{
liste_el *anf;
liste_el *ende;
} liste;
void create(liste *l){
l->anf = NULL;
l->ende = NULL;
return;
}
void reset(liste *l){
if(l) l->ende = NULL;
return;
}
void delete(int pos, liste *l){
liste_el *t,*s=NULL;
t = (liste_el*)malloc(sizeof(liste_el));
t = l->anf;
while(t){
if(t->wert == pos ){
s = t->next;
free(t);
t = s;
return;
}
t = t->next;
}
return;
}
void ausgabe(liste *l){
/* Gibt die Liste aus */
liste_el *t;
t = (liste_el*)malloc(sizeof(liste_el));
t = l->anf;
do{
//if(t->wert != 0)
printf("%i ",t->wert);
t = t->next;
}while(t);
printf("Listenende\n");
return;
}
void einlesen(liste *l, int N_MAX){
/* Einlesen der Werte in die Liste */
int i;
liste_el *t;
for(i=1;i<=N_MAX;i++){
t = (liste_el*)malloc(sizeof(liste_el));
t->wert = i;
t->next = NULL;
if(l->anf == NULL){
l->anf = t;
l->ende = NULL;
}else{
l->ende->next = t;
}
l->ende = t;
}
return;
}
liste_el* suche(liste_el *t){
/* Naechstes Element suchen, welches != 0 ist */
do{
t = t->next;
}while(t->wert == 0);
return t;
}
void algo(liste *l, int N_MAX){
/* Algorithmus: Sieb des Erathostenes */
int p,a;
liste_el *t;
reset(l);
t = (liste_el*)malloc(sizeof(liste_el));
t = l->anf;
t = t->next; // Auf Position 2 setzen
while(((t->wert)*(t->wert)) <= N_MAX){
for(p=2;p*(t->wert)<=N_MAX;p++){
a = p*(t->wert);
delete(a,l);
}
t = suche(t);
ausgabe(l);
}
return;
}
int main(){
int anzahl;
printf("\nSieb des Erathostenes\n");
printf("=====================\n\n");
printf("Bestimmt werden die Primzahlen der Folge 1,2,3,...,n .\n\n");
printf("Geben Sie die Obergrenze der Folge ein: ");
scanf("%d",&anzahl);
if(anzahl<1){
printf("\nFehler: n<1\nDas Programm wird beendet.\n\n");
return 1;
}
liste l;
create(&l);
/* Feldwerte zuweisen */
einlesen(&l,anzahl);
/* Sieb des Erathostenes */
algo(&l,anzahl);
return 0;
}