Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    5

    divisione di una lista mediante ricorsione (secondo particolare criterio)

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

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    5
    nessuno mi può aiutare???

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.