Problema con esercizio su funzione ricorsiva

di il
2 risposte

Problema con esercizio su funzione ricorsiva

Salve, stavo svolgendo un esercizio che consiste nel realizzare una funzione che, passato per argomento un array di numeri interi, restituisca una
lista ordinata degli elementi dell'array. Il resto del codice utilizzato proviene da materiale di esercizi precedenti, quindi dovevo solo creare questa funzione. Prima volevo vedere di scriverla semplicemente con il metodo iterativo e funzionava tranquillamente, ma quando ho provato a convertirla col metodo ricorsivo non riuscivo ad ottenere la stessa cosa.
Precedentemente,al posto di size nel ciclo for avevo usato una macro MAX definita con un numero fisso,ma, dopo averlo sostituito,ricompilato e avviato, il programma si arresta.
Facendo altre prove con la forma ricorsiva, è come se non venisse preso come argomento size e non capisco a cosa è dovuto questo errore.
Grazie in anticipo per l'aiuto, questo è il codice che si arresta quando tenta di creare la lista:
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h>
struct listNode{
	int item;
	struct listNode * next;
};	
typedef struct listNode ListNode;
typedef ListNode* Nodeptr;

int isEmpty( Nodeptr s){
	return s == NULL;
}

void insert(Nodeptr *s, int value);
void print(Nodeptr current);
Nodeptr arrayToDoubleList(int array[], unsigned int size);


int main(){
	srand(time(0));
	
	char value;
	unsigned int N;
	printf("dimensione array: ");
	scanf("%u", &N);
	int array[N];
	for(size_t i = 0; i < N; i++){
		array[i] = rand() % 100;
		printf("|%d|", array[i]);
	}
	
	Nodeptr start = arrayToDoubleList(array, N);
	print(start);
}

void insert(Nodeptr *s, int value){
	Nodeptr new = malloc(sizeof(ListNode));//creazione nodo della lista
	if(new != NULL){//SE la malloc è andata a buon fine:
		new->item = value;//inserire il valore nel campo informativo del nodo
		new->next = NULL;//mettere a NULL il puntatore al prossimo nodo della lista
	
	Nodeptr current = *s;
	Nodeptr previous = NULL;
	
	//trovare la posizione corretta dell'elemento nella lista:
	while( current != NULL && value > current->item){
	previous = current;//assegna il nodo alla lista corrente a quello precedente
	current = current->next;//va avanti al nodo successivo
	}
	if(previous == NULL){
		new->next = *s;
		*s = new;
	}
	else{//inserisci il nuovo nodo tra previous e current
	    previous->next = new;
		new->next = current;
	}
}else{
	printf("non inserito: memoria non disponibile.\n");
   }
}

void print(Nodeptr current){
	if(isEmpty(current)){
		printf("la lista e' vuota\n\n");
	}
	else{
		puts("\nLa lista e':\n");
		while(current != NULL){
			printf("%d-->",current->item);
			current = current->next;
		}
		puts("NULL\n");
	}
}

Nodeptr arrayToDoubleList(int array[], unsigned int  size){
	 Nodeptr list = NULL;
	
	 for(size_t i = 0; i < size; i++){
		 insert(&list, array[i]);
	 }
	
	 
 }

2 Risposte

  • Re: Problema con esercizio su funzione ricorsiva

    Questo sarebbe l'output usando il ciclo all'interno del main senza funzioni esterne:
    |83||49||40||60||77||27||94||94||38||70|
    La lista e':

    27-->38-->40-->49-->60-->70-->77-->83-->94-->94-->NULL
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <time.h>
    #define MAX 10
    struct listNode{
    	int item;
    	struct listNode * next;
    };	
    typedef struct listNode ListNode;
    typedef ListNode* Nodeptr;
    
    int isEmpty( Nodeptr s){
    	return s == NULL;
    }
    
    void insert(Nodeptr *s, int value);
    void print(Nodeptr current);
    Nodeptr arrayToDoubleList(int array[], unsigned int size);
    
    
    int main(){
    	srand(time(0));
    	
    	char value;
    	Nodeptr start = NULL;
    	int array[MAX];
    	for(size_t i = 0; i < MAX; i++){
    		array[i] = rand() % 100;
    		printf("|%d|", array[i]);
    	}
    	
    	 for(size_t i = 0; i < MAX; i++){
    		 insert(&start, array[i]);
    	 }
    	print(start);
    }
    
    void insert(Nodeptr *s, int value){
    	Nodeptr new = malloc(sizeof(ListNode));//creazione nodo della lista
    	if(new != NULL){//SE la malloc è andata a buon fine:
    		new->item = value;//inserire il valore nel campo informativo del nodo
    		new->next = NULL;//mettere a NULL il puntatore al prossimo nodo della lista
    	
    	Nodeptr current = *s;
    	Nodeptr previous = NULL;
    	
    	//trovare la posizione corretta dell'elemento nella lista:
    	while( current != NULL && value > current->item){
    	previous = current;//assegna il nodo alla lista corrente a quello precedente
    	current = current->next;//va avanti al nodo successivo
    	}
    	if(previous == NULL){
    		new->next = *s;
    		*s = new;
    	}
    	else{//inserisci il nuovo nodo tra previous e current
    	    previous->next = new;
    		new->next = current;
    	}
    }else{
    	printf("non inserito: memoria non disponibile.\n");
       }
    }
    
    void print(Nodeptr current){
    	if(isEmpty(current)){
    		printf("la lista e' vuota\n\n");
    	}
    	else{
    		puts("\nLa lista e':\n");
    		while(current != NULL){
    			printf("%d-->",current->item);
    			current = current->next;
    		}
    		puts("NULL\n");
    	}
    }
    
  • Re: Problema con esercizio su funzione ricorsiva

    Nvm risolto, così funziona alla stessa maniera:
    Nodeptr arrayToDoubleList(int array[], unsigned int size){
    	
    	/*for(unsigned int i = 0; i < size; i++)
    		insert(&start, array[i]);
    	    print(start);*/
    		if(size == 0) return NULL;
    	 Nodeptr start = arrayToDoubleList(array, size - 1);
    	 insert(&start, array[size - 1]);
    	 return start;
    }
Devi accedere o registrarti per scrivere nel forum
2 risposte