Newsgroup: it.comp.lang.c
Titolo: Problema con Liste

Salve a tutti,il problema è il seguente:
dovrei creare un algoritmo ricorsivo dal seguente prototipo:
LISTA CreaLista(LISTA L,char inizio,char fine);
questa funzione deve crearmi una lista ke ha per elemento iniziale
inizio,per elemento finale fine e per elementi intermedi tutte le lettere
tra inizio e fine.
Ad esempio dando in ingresso (L,d,h) la lista creata è defgh.
Vi scrivo la mia implementazione:
LISTA CreaListaR(LISTA l,char inizio,char fine){
      if(inizio=fine)
      return CreaNodo(fine);
       L=CreaNodo(inizio);
       L->next=(L+1);
       return CreaListaR(L->next,inizio+1,fine);
       }
}
La precedente funzione non va,mi crea una lista formata solo dall ultimo
elemento(ho verificato questo stampandola).Per una maggiore chiarezza vi
scrivo anche le altre definizioni e funzioni usate in CreaListaR(anche se
non necessarie credo):
NODO* CreaNodo(char el){
      NODO *pnod;
      pnod=(NODO*)malloc(sizeof(NODO));
      if(pnod==NULL){
        printf("Nodo non creato\n\n");
        return NULL;
      }
      pnod->elem=el;
      pnod->next=NULL;
      return pnod;
}
dove il tipo NODO è il seguente:
typedef struct Tag_Nodo{
        char elem;
        struct Tag_Nodo *next;
        }NODO,*LISTA;
detto questo,potreste aiutarmi con la funzione CreaListaR?Vi prego,non
dovrebbe essere difficile ma questa è la mia prima esercitazione con le
liste e non so trattarle ancora bene.
Vi ringrazio anticipatamente

       return CreaNodo(fine);
Qui non dovrebbe essere inizio = = fine ?? invec di = e basta ?
Non so nemmeno perchè mi son fermato a leggere il codice visto che la mia
comprensione è pari a 0 in confronto ad altri partecipanti all'NG...forse
curiosità ;-)
Cmq. non ti preoccupare che qualcuno di infallibile presto arriva ad
aiutarti con la risposta.... almeno spero :-p
Però vedi se effettivamente quell'if ti dava problemi... chissà magari c'ho
preso :-ppp
Byezzzz!!!
Shaden

 Qui non dovrebbe essere inizio = = fine ?? invec di = e basta ?
Grazie per la puntualizzazione.
Ho provato ma non era quello(era troppo poco ) :)


A parte l'errore che ti hanno gia' fatto notare (=/==) credo che sia errato
l'approccio per la creazione, ovvero la direzione con cui crei la lista;
te vai dal primo all'ultimo elemento, e quando hai finito la ricorsione
(caso base) ritorni il nodo con "fine" che viene passato indietro a tutte le
chiamate.
Quindi alla fine, la lista l'hai effettivamente creata, ma ti sei perso il
puntatore alla testa; hai solo il puntatatore all'ultimo elemento, ovvero
alla coda.
Credo che dovresti costruire la lista al contrario, partendo da "fine" e
andando verso "inizio".
Non capisco l'assegnamento
L->next = (L+1);
forse doveva essere qualcosa tipo
l->next = L;
Resta il fatto che all'interno della funzione non utilizzi mai il parametro
"l".
Un altro appunto:
per il controllo del caso base io metterei
if (inizio >= fine)
cosi' e' un po' piu' robusto in caso di chiamate "errate".
Ragiona un po' su queste cose, se ti va.
Ciao,
Ema


Mica potresti aiutarmi scrivendo la funzione?
Non mi riesce proprio.
In particolare credo che manchi il puntamento di ogni nodo al successivo.

 }
a prima vista l'errore mi sembra L->next=(L+1):
io avrei messo (per aggiungere brytalmente in coda l'elemento della lista):
if (l==NULL)
l=CreaNodo(inizio);
else
L->next=CreaNodo(inizio);
inizializzando L a null.

niente, ho detto una cagata, passo un parametro solo al
posto di 3...aspe che a volte la fretta è cattiva consigliera
"Andrea Richiardi" <ari...@NOSPAMinwind.it> ha scritto nel messaggio
news:7DOAa.37811$lK4.1...@twister1.libero.it...



Ci ho ragionato un po' e forse la soluzione che proponevi non era poi cosi'
tanto sbagliata come avevo immaginato all'inizio; chiedo scusa se forse ti
ho sviato dalla soluzione.
Ho provato a scrivere la funzione, ma non l'ho provata. Questo sta a te.
LISTA CreaListaR(char inizio,char fine){
  LISTA L;
  if(inizio>=fine)
    return CreaNodo(fine);
  else {
    L=CreaNodo(inizio);
    L->next=CreaListaR(inizio+1,fine);
    return L;
  }
}
Ciao,
Ema