|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: May 2006
Messaggi: 19
|
[C] Esercizio su liste
salve, visto che domani ho un esame, qualcuno sarebbe così gentile da dirmi come si fa in C questo esercizio?
E' un esercizio vecchio, vorrei solo capire come vanno modificati i puntatori perchè non capisco. Scrivere una funzione C: lista alternaListaPlace (lista L, lista M) che restituisce una lista in cui i nodi di L sono alternati con quelli di M. Eseguire l'operazione senza allocare nuova memoria, ma semplicemente spostando i puntatori. Se una delle due liste è più corta dell'altra, la coda della più lunga viene semplicemente attaccata in fondo. Restituire come risultato un puntatore alla testa della lista alternata. Ultima modifica di nixonik : 05-02-2008 alle 18:33. |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Apr 2007
Messaggi: 263
|
Cosa intendi per lista alternata
lista1 = [1 3 5 7 9] lista2 = [2 4 6 8] listaAlt = [1 2 3 4 5 6 7 8 9] |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: May 2006
Messaggi: 19
|
esatto....come dice senza allocare nuova memoria, ma soltanto modificando i puntatori..
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Tra le regole del forum ce n'è una che dice : "Non si risolvono esercizi completi di scuola o università" .
Posta una tua soluzione (probabilmente sbagliata) e poi noi la correggiamo Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Ah, cambia il titolo del thread in "[C] Esercizio su liste" il prima possibile , altrimenti appena arriva cionci te lo chiude :/
__________________
GPU Compiler Engineer |
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: May 2006
Messaggi: 19
|
lo so, ma io non ho idea di come si faccia...avevo fatto qualcosa del genere
Codice:
slistptr alternalista (slistptr L, slistptr M)
{
slistptr alternata;
int c=1;
while ((L!=NULL)||(M!=NULL))
{
if (c%2==0){
alternata->str=M->str;
M=M->next;}
else{
alternata->str=L->str;
L=L->next;}
c++;
alternata=alternata->next;
}
while (alternata!=NULL)
{
printf("%d -> ",alternata->str);
alternata=alternata->next;
}}
ILLUMINATEMI non devo consegnare l'esercizio, è solo che domani ho l'esame e vorrei capirci meglio |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Prova questa versione.
Non ti assicuro che funzioni perchè non ho potuto provarla (su sto PC non ho un compilatore C purtroppo) . E' una versione ricorsiva. Distrugge entrambe le liste (E' l'unico modo di fare se non ne vuoi allocare un altra) e ne crea un altra che è la concatenazione delle due nel modo richiesto (in teoria Codice:
slistptr alternaListe(slistptr L, slistptr M) {
if (L == NULL)
return M;
if (M == NULL)
return L;
L->next = alternaListe(M, L->next);
return L;
}
Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: May 2006
Messaggi: 19
|
Funziona Grazie cmq Mi spiegheresti com'è che fa a funzionare però? O.o diciamo che se la L è vuota ritorna M e se M è vuota ritorna L..fin qui ok.... poi non capisco l'assegnazione..nel secondo elemento di L mette...?? come funziona? :S Ultima modifica di nixonik : 05-02-2008 alle 20:27. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Eh, le funzioni ricorsive possono essere un po' criptiche
La funzione spezzetta il problema in parti sempre più semplici (ad ogni chiamata di funzione) fino a raggiungere il momento in cui il problema è talmente semplice da essere risolvibile con una (o poco più) istruzione. Il metodo di "spezzettamento" è richiamare la funzione "alternaListe()" invertendo i suoi parametri (cioè facendo diventare nella successiva chiamata quella che correntemente è M la L e quella che adesso è L->next la M della nuova chiamata). Questo procedimento di inversione inquadra perfettamente il problema originale che è "alternare" gli elementi all'interno delle liste, infatti, se noti , la lista che nella prima chiamata è L nella seconda diventa M per poi tornare L nella terza chiamata. In pratica si alternano, esattamente come deve succedere per gli elementi della lista finale. Inoltre con il L->next piano piano si avanza nella lista elemento per elemento arrivando infine a NULL (quando una delle due liste sarà stata completamente iterata). A questo punto il lavoro della funzione è terminate e ritorna l'altra lista che non è NULL come ultimo elemento della nuova lista (o se le liste hanno la stessa lunghezza ritorna comunque NULL). Putroppo spiegare il funzionamento di una funzione ricorsiva senza un appoggio grafico è tosta. Ti consiglio di farti uno schizzetto su carta segnandoti i valori delle variabili tra le varie chiamate di funzioni per due liste relativamente corte (2 o 3 elementi) Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
#10 |
|
Junior Member
Iscritto dal: May 2006
Messaggi: 19
|
ci proverò...
grazie mille per il tuo tempo |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:13.



















