Ciao a tutti, questo è il mio problema:
Definire una procedura ricorsiva dividi che, dati una lista di interi positivi l e un intero positivo val, suddivide la lista l in due liste: la prima contiene tutti gli elementi di l che sono multipli di val e l'altra contiene tutti gli elementi di l che non sono multipli di val. Il prototipo della procedura è: void dividi(Lista_int l, int val, Lista_int *pl1, Lista_int *pl2) dove l è la lista da suddividere e *pl1 e *pl2 sono le liste ottenute come output.
Utilizzare le seguenti definizioni di tipo, da non consegnare:
typedef struct elem_i {
int val;
struct elem_i *next;
} Elem_int;
typedef Elem_int *Lista_int;
premetto: uso visual studio 2010 (lo so è come usare un carrarmato x una zanzara ma mi trovo bene, e visto che lo ho installato x f#nn vedo perchè non usarlo )
oltre al fatto che non capisco l'uso di Lista_int *pl1, Lista_int *pl2 non posso non deferenziarle?? (visto che ho:typedef Elem_int *Lista_int; che già deferenzia??)
comunque io ho scritto questo codice ma non va crasha senza alcuna spiegazione, da test effettuati presumo crashi quando faccio pl1->val=l->val;
sapreste dirmi perchè si rifiuta di funzionare??? anche se faccio un semplice pl1->val=5;
insomma il problema è come gestisco pl1 (e di conseguenza immagino pl2)
grazie a tutti
il mio codice:
codice:
void dividi(Lista_int l, int val, Lista_int pl1, Lista_int pl2)
{
if(l==NULL)
{
pl1=pl2=l;
//return??;
}
else
{
if ((l->val % val)==0)
{//crea lista pl1
if (pl1==NULL)
{
pl1==(Lista_int)malloc(sizeof(Lista_int));
pl1->val =l->val;
}
else
{
pl1->next=(Lista_int)malloc(sizeof(Lista_int));
pl1=pl1->next;
pl1->val =l->val;
}
printf("prova: \n");
}
else
{//crea lista pl2
if (pl2==NULL)
{
pl2==(Lista_int)malloc(sizeof(Lista_int));
pl2->val =l->val;
}
else
{
pl2->next=(Lista_int)malloc(sizeof(Lista_int));
pl2=pl1->next;
pl2->val =l->val;
}
}
//avanza e riparti
l=l->next;
dividi(l,val,pl1,pl2);
}
}
eventuale main se volete testarlo... penso sia ok solo un po ridondante...
codice:
#include "stdafx.h"
#include <stdlib.h>
typedef struct elem_i {
int val;
struct elem_i *next;
} Elem_int;
typedef Elem_int *Lista_int;
void dividi(Lista_int l, int val, Lista_int pl1, Lista_int pl2);
int _tmain(int argc, _TCHAR* argv[])
{
int n,i, val;
Lista_int lista,l2,pl1,pl2;
printf("quante informazione si vogliono inserire?");
scanf("%d",&n);
if(n==0) lista=NULL;
else
{
lista=(Lista_int)malloc(sizeof(Lista_int));
printf("inserire informazione 1: ");
scanf("%d", &lista->val);
l2=lista;
for(i=2; i<=n;i++)
{
l2->next=(Lista_int)malloc(sizeof(Lista_int));
l2=l2->next;
printf("inserisci l'info n%d: ",i);
scanf("%d", &l2->val);
}
l2->next=NULL;
}
l2=lista;
printf("\nlista inizio\n");
while(l2!=NULL)
{
printf("%d",l2->val);
printf("--> ");
l2=l2->next;
}
printf("NULL");
l2=lista;
pl1=NULL;
pl2=NULL;
val=2;
dividi(lista,val,pl1,pl2);
l2=lista;
printf("\nlista 0\n");
while(l2!=NULL)
{
printf("%d",l2->val);
printf("--> ");
l2=l2->next;
}
printf("NULL");
l2=pl1;
printf("\nlista 1\n");
while(l2!=NULL)
{
printf("%d",l2->val);
printf("--> ");
l2=l2->next;
}
printf("NULL");
l2=pl2;
printf("\nlista 2\n");
while(l2!=NULL)
{
printf("%d",l2->val);
printf("--> ");
l2=l2->next;
}
printf("NULL");
return 0;
}