PDA

Visualizza la versione completa : [C] Problema liste


etop91
12-06-2014, 18:18
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?:)



#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);
}

minomic
12-06-2014, 20:59
Ciao,
beccato l'errore! :D
Era nella funzione printListI. La versione corretta è questa:



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(t->lista_divisori);
printf("\n");
}
}


Invece tu avevi scritto



printListD(p->lista_divisori);



cioè una "p" al posto di una "t".

:ciauz:

Loading