Ho un problema con questo programma. Genero 10 numeri interi pseudo-casuali e per ognuno calcolo per quali numeri interi nell'intervallo [2,10] è divisibile. Voglio inserire i numeri generati casualmente in una lista i cui nodi contengono un puntatore ad un'altra lista che contiene i divisori di quel nodo.
Il problema è che inserisce per tutti i numeri gli stessi divisori del primo numero generato.
Qualcuno può aiutarmi a scovare l'errore?
codice:
#include <stdio.h>#include <stdlib.h>
#include <time.h>
struct divisore {
int div;
struct divisore *next;
};
struct numero {
int n;
struct numero *next;
struct divisore *lista_divisori;
};
void printListI(struct numero *p);
void printListD(struct divisore *p);
struct numero * insertTail(struct numero * head,struct numero * n);
struct numero * nuovoNumero(int num);
struct divisore * inserisciDivisore(struct divisore * head, struct divisore * n);
struct divisore * nuovoDivisore(int divis);
int main()
{
srand(time(NULL));
struct numero *head = NULL;
struct numero *newNumb = NULL;
struct divisore *divis = NULL;
int num, i, j;
for(i=0; i<10; ++i){
num = 1 + rand()%99;
newNumb = nuovoNumero(num);
for(j=2; j<=10; ++j) {
if((newNumb->n % j) == 0){
divis = nuovoDivisore(j);
newNumb->lista_divisori = inserisciDivisore(newNumb->lista_divisori, divis);
}
}
head = insertTail(head, newNumb);
}
printListI(head);
printf("\n");
return 0;
}
struct numero * nuovoNumero(int num) {
struct numero *nuovo = malloc(sizeof(struct numero));
nuovo->n = num;
nuovo->next = NULL;
nuovo->lista_divisori = NULL;
return nuovo;
}
struct divisore * nuovoDivisore(int divis) {
struct divisore *nuovo = malloc(sizeof(struct divisore));
nuovo->div = divis;
nuovo->next = NULL;
return nuovo;
}
struct divisore * inserisciDivisore(struct divisore * head, struct divisore * n){
if(head==NULL)
return n;
struct divisore * t=head;
while(t->next!=NULL)
t=t->next;
t->next=n;
return head;
}
struct numero * insertTail(struct numero * head, struct numero * n){
if(head==NULL)
return n;
struct numero * t=head;
while(t->next!=NULL)
t=t->next;
t->next=n;
return head;
}
void printListI(struct numero *p) {
struct numero *t = p;
for(;t!=NULL; t = t->next) {
printf("%3d DIVISORI nell'intervallo [2,10]: ", t->n);
printListD(p->lista_divisori);
printf("\n");
}
}
void printListD(struct divisore *head) {
struct divisore *t = head;
for(;t!=NULL; t = t->next)
printf("%d ", t->div);
}