|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 439
|
[c] problema liste concatenate
ciao ragazzi
ho il seguente problema date due liste L1 ed L2 devo fonderle in un unica lista L3 con una funzione RICORSIVA devo copiare il primo elementto di L1 in L3 , il primo elemento di L2 nel secondo di L3 poi il secondo di L1 nel terxo di L3 ed il secondo di L2 nel quarto di L3e così via esempio L1 = 1 3 5 6 7 L2 = 2 4 6 8 L3= 1 2 3 4 5 6 7 8 le due liste hanno lunghezza diverse per ora ho fatto questo codice ma non va dove sbaglio ? il codice mi va in loop Codice:
struct elemento *FUSIONE(struct elemento *L1,struct elemento *L2,
struct elemento *testa)
{
struct elemento *app;
if ((L1!=NULL)||(L2!=NULL))
{
if (testa==NULL)
{
testa=(struct elemento *)malloc(sizeof (struct elemento));
app=testa;
}
else
if (L1!=NULL)
{
app->inf=L1->inf;
app=app->next;
app=(struct elemento *)malloc(sizeof (struct elemento));
if (L2!=NULL)
{
app->inf=L2->inf;
app=app->next;
app=(struct elemento *)malloc(sizeof (struct elemento));
}
return FUSIONE(L1->next,L2->next,app);
}
else
{
app->inf=L2->inf;
return FUSIONE(NULL,L2->next,app);
}
}
else
{
app=NULL;
return testa;
}
}
__________________
my pc :core duo2 e8500 ,asus rampage formula,corsair dominator 4giga, sapphire ati4870 512mb monitor samsung 22" t220hd vista 32bit Nel corso della vita, non ci sarà certo penuria di gente che ti dice come vivere, avranno tutte le risposte, cosa dovresti fare, cosa non dovresti fare. Non ci discutere mai, tu di' sempre: «Ah sì? è un'idea davvero brillante» e poi fai come ti pare.(Woody Allen) Ultima modifica di *MATRIX* : 07-11-2010 alle 12:10. |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Jul 2007
Messaggi: 57
|
Scusa ma non ho capito bene una cosa....
al termine di tutta la procedura...le liste L1 ed L2 devono sparire dalla memoria??? e rimane solo L3...oppure vuoi creare una lista L3 mantenendo comumque L1 ed L2?
__________________
...POWER IS NOTHING WITHOUT CONTROL...
Ultima modifica di xxNeoxx : 07-11-2010 alle 16:41. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 439
|
le liste L1 e L2 devono restare , sostanzialmente deve essere una copia dei valori delle due liste in in L3 ma RICORSIVAMENTE
ti prego dammi una mano
__________________
my pc :core duo2 e8500 ,asus rampage formula,corsair dominator 4giga, sapphire ati4870 512mb monitor samsung 22" t220hd vista 32bit Nel corso della vita, non ci sarà certo penuria di gente che ti dice come vivere, avranno tutte le risposte, cosa dovresti fare, cosa non dovresti fare. Non ci discutere mai, tu di' sempre: «Ah sì? è un'idea davvero brillante» e poi fai come ti pare.(Woody Allen) |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Aug 2005
Messaggi: 168
|
A parte che non mi è molto chiara la struttura della tua chiamata ma direi che come l'hai fatta te (a parte andarti in loop infinito, che ammetto di non aver cercato) ti ritorna una lista con tutta la lista 1 e poi tutta la lista 2, che non è quello che ti serve, o no?
EDIT: Guardando meglio aggiungo anche che dovresti cercare di eliminare il parametro testa, la lista dovresti crearla sfruttando i valori di ritorno della ricorsione, non così. PS: Ti va in loop infinito perchè non entra mai in L2, l'ultimo Codice:
return FUSIONE(NULL,L2->next,app); Codice:
return FUSIONE(L2->next,NULL,app); Ultima modifica di Kenger : 07-11-2010 alle 22:32. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Jul 2007
Messaggi: 57
|
sbagli nella gestione dei puntatori....è da un po che non programmo in C/C++ comunque deve fare attenzione al campo next dell'elemento aggiunto, inoltre per le funzioni ricorsive, conviene usare il puntatore originario di L3 per evitare sovraccarico della memoria e errori di ritorno...
ora ti posto una versione funzionante di quello che volevi fare...così capisci dove sbagli... Codice:
#include <stdio.h>
#include <stdlib.h>
struct el
{
int inf;
struct el* next;
};
void crea_lista(struct el**);
void show_lista(struct el*);
void fusione(struct el*, struct el*, struct el**);
int main()
{
struct el* L1=NULL;
struct el* L2=NULL;
struct el* L3=NULL;
printf("inserire i dati per la prima lista:\n");
crea_lista(&L1);
printf("\n\ninserire i dati per la seconda lista:\n");
crea_lista(&L2);
printf("\n\necco la prima lista: ");
show_lista(L1);
printf("\n\necco la seconda lista: ");
show_lista(L2);
printf("\n\necco la lista unita: ");
fusione(L1,L2,(&L3));
show_lista(L3);
printf("\n\necco la prima lista: ");
show_lista(L1);
printf("\n\necco la seconda lista: ");
show_lista(L2);
printf("\n\n");
return 0;
}
void crea_lista(struct el** L1)
{
int i,n;
struct el* app;
printf("quanti elementi vuoi caricare?: ");
scanf("%d",&n);
for (i=0;i<n;i++)
{
if(*L1==NULL)
{
app=(struct el*)malloc(sizeof(struct el));
printf("\ninserire il %d valore: ",i+1);
scanf("%d",&app->inf);
app->next=NULL;
*L1=app;
}else
{
app=*L1;
while(app->next!=NULL)
app=app->next;
app->next=(struct el*)malloc(sizeof(struct el));
printf("inserire il %d valore: ",i+1);
scanf("%d",&app->next->inf);
app->next->next=NULL;
}
}
}
void show_lista(struct el *L1)
{
while(L1!= NULL)
{
printf("%d ",L1->inf);
L1=L1->next;
}
}
void fusione(struct el* L1, struct el* L2, struct el** L3)
{
struct el* p;
struct el* q;
struct el* app;
if ((L1!=NULL)||(L2!=NULL))
{
if(L1!=NULL)
{
if((*L3)==NULL)
{
app=(struct el*)malloc(sizeof(struct el));
app->inf=L1->inf;
app->next=NULL;
*L3=app;
L1=L1->next;
if(L2!=NULL)
{
q=(struct el*)malloc(sizeof(struct el));
q->inf=L2->inf;
q->next=NULL;
app->next=q;
L2=L2->next;
}
}else
{
p=*L3;
while(p->next!=NULL)
p=p->next;
q=(struct el*)malloc(sizeof(struct el));
q->inf=L1->inf;
q->next=NULL;
p->next=q;
L1=L1->next;
if(L2!=NULL)
{
q=(struct el*)malloc(sizeof(struct el));
q->inf=L2->inf;
q->next=NULL;
p->next->next=q;
L2=L2->next;
}
}
}else if(L2!=NULL)
{
if(*L3==NULL)
{
app=(struct el*)malloc(sizeof(struct el));
app->inf=L2->inf;
app->next=NULL;
L2=L2->next;
*L3=app;
}else {
p=*L3;
while(p->next!=NULL)
p=p->next;
q=(struct el*)malloc(sizeof(struct el));
q->inf=L2->inf;
q->next=NULL;
p->next=q;
L2=L2->next;
}
}
fusione(L1,L2,&(*L3));
}
}
__________________
...POWER IS NOTHING WITHOUT CONTROL...
Ultima modifica di xxNeoxx : 10-11-2010 alle 20:25. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:53.











...POWER IS NOTHING WITHOUT CONTROL...








