PDA

Visualizza la versione completa : [C] Funzione ricorsiva crea lista da array


bersan
24-01-2007, 11:31
Salve a tutti,
sto cercando di scrivere una funzione ricorsiva che prendendo un array come argomento mi restituisca una lista. il codice che segue è il meglio che ho potuto fare:



#include <stdio.h>
typedef struct lista
{
int num;
struct lista *suc;
} Ls;
Ls* creaListaDaArray(int array[])
{
Ls* testa;
if (array[0] == 0) return(NULL);
else {
testa=(Ls*)malloc(sizeof(Ls));
testa->num = array[0];
testa->suc = creaListaDaArray(array+1);
return(testa);
}
}
void stampaLista(Ls *testa)
{
if (testa == NULL)
{
printf("NULL");
return;
}
while (testa != NULL)
{
printf("%d ", testa->num);
testa = testa->suc;
}
}

main()
{
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Ls *testa;
testa = creaListaDaArray(array);
stampaLista(testa);
}

Non riesco a capire dove sbaglio perché il programma mi stampa:
1 2 3 4 5 6 7 8 9 10 7209077 7733353 74 2 2293680 4198887 1 4143072 4139368 4210
688 2293668 -1 2293672 -2126502240 -1 4139368

Inoltre se un elemento del array fosse pari a 0 la funzione creaListaDaArray non funzionerebbe... Sarei molto grato se qualcuno mi desse una mano a risolvere il problema.

roxxy86
24-01-2007, 11:51
Facile:
se l'array fosse

int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0};

funzionarebbe tutto!!
il problema è che senza lo 0 finale non mette l'ultimo elemento della lista a null!! e quindi il ciclo di stampa va avanti finche' non trova uno 0 memorizzato casualmente in memoria!
OK??

bersan
24-01-2007, 12:23
Originariamente inviato da roxxy86
Facile:
se l'array fosse

int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0};

funzionarebbe tutto!!
il problema è che senza lo 0 finale non mette l'ultimo elemento della lista a null!! e quindi il ciclo di stampa va avanti finche' non trova uno 0 memorizzato casualmente in memoria!
OK??
Grazie per avermi risposto.
Capisco che la funzione andrebbe bene se l’ultimo elemento del array, e solo esso, fosse pari a 0 ma vorrei sapere come bisogna scriverla affinché andasse bene per qualsiasi array di interi passato come argomento. Ad esempio:


int array = {1, 2, 3, 0, 6, 10};
Ls *creaListaDaArray(int array[])
{
// ???
}

roxxy86
24-01-2007, 12:34
il discorso è questo:
in C++ non è possibile sapere quanto è grande un array (non esiste un arry.length) quindi o utilizzi una variabile nella quale memorizzi il numero di elementi inseriti, o utilizzi una sentinella alla fine... c'è poco da fare!
e la sentinella potrebbe essere un numero del tipo MAX_INT o MIN_INT

Loading