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