PDA

Visualizza la versione completa : Duplicazione liste in c tramite ricorsione


gabama
08-03-2009, 21:41
Devo ancora chiedere una cosa sulle liste,dopo aver svolto esercizi di operazioni su ricorsioni e duplicazione su una singola lista, qui mi da un problema.....
Nell' output mi da 1 e si "blocca",come al solito l' errore sarà nella funzione duplica.....vorrei farne una che duplichi 1 numeri in posizione dispari di l1 e pari di l2
Spero nei vostri consigli.....
Grazie in anticipo




#include <stdlib.h>
#include <stdio.h>

typedef struct nod {
int data;
struct nod *next;
struct nod *prev;
} node;

node *newnode(void)
{
return (node *)malloc(sizeof(node));
}

/* Dato un intero n>0, costruisce la lista di nodi da 1 ad n */
node *buildlis()
{
int x;
node *lis, *p, *last;
printf("nuovo numero da inserire in lista:\n");
scanf("%d", &x);
if (x==00000)
lis= NULL; /* caso di lista vuota */
else
{
/* inserzione del primo elemento in una lista */
last=newnode();
lis = last;
last->data = x;
last->next = NULL;
printf("nuovo numero da inserire in lista (00000 per terminare):\n");
scanf("%d", &x);
while (x!=00000)
/* Invariante: lis punta alla lista con tutti gli interi finora letti, tranne l'ultimo, e last punta all'ultimo nodo di tale lista */
{
p=newnode();
p->data = x;
p->next = NULL;
last->next = p;
last = p;
printf("nuovo numero da inserire in lista (00000 per terminare):\n");
scanf("%d", &x);
}
}
return(lis);
}


/* Stampa degli elementi di una lista */
void printlis(node *lis)
{
node* tmp;

tmp = lis;
int somma=0;float media=0;int conteggio=0;

while (tmp != NULL) {
printf(">>>> %d\n", tmp->data) ;
tmp = tmp->next;

}

}

void myFree ( node* top )
{
node* tmp;
tmp = top;

while ( top->next != NULL ) {
tmp = top->next;
free(top);
top = tmp;
}
}
node *duplica(node *l1,node *l2,int pos){
node *p;

if((l1!=NULL) && (l2!=NULL)){
if(pos%2!=0){
p=newnode();
p->data=l1->data;
p->next=duplica(l1->next,l2->next,pos+1);}


return p;}}







int main()
{
node* head;node* head2;node *dup;

printf ("-----LISTA A-----\n");
head = buildlis ( );
printf ("-----LISTA B-----\n");
head2 = buildlis ( );


printf ("\n-----STAMPA LISTA A-----\n");
printlis(head);
printf ("\n-----STAMPA LISTA B-----\n");
printlis(head2);

printf ("\n-----CONTROLLO-----\n");
int som=0;
dup=duplica(head,head2,1);
printlis(dup);

free ( head );


return 0;
}

gabama
08-03-2009, 23:04
ho provato a modificare così il codice ,ma mi da ancora un errore e non stampa i risultati,sotto ho postato 1 funzione su una singola lista e funziona




#include <stdlib.h>
#include <stdio.h>

typedef struct nod {
int data;
struct nod *next;
struct nod *prev;
} node;

node *newnode(void)
{
return (node *)malloc(sizeof(node));
}

/* Dato un intero n>0, costruisce la lista di nodi da 1 ad n */
node *buildlis()
{
int x;
node *lis, *p, *last;
printf("nuovo numero da inserire in lista:\n");
scanf("%d", &x);
if (x==00000)
lis= NULL; /* caso di lista vuota */
else
{

last=newnode();
lis = last;
last->data = x;
last->next = NULL;
printf("nuovo numero da inserire in lista (00000 per terminare):\n");
scanf("%d", &x);
while (x!=00000)

{
p=newnode();
p->data = x;
p->next = NULL;
last->next = p;
last = p;
printf("nuovo numero da inserire in lista (00000 per terminare):\n");
scanf("%d", &x);
}
}
return(lis);
}


/* Stampa degli elementi di una lista */
void printlis(node *lis)
{
node* tmp;

tmp = lis;
int somma=0;float media=0;int conteggio=0;

while (tmp != NULL) {
printf(">>>> %d\n", tmp->data) ;
tmp = tmp->next;

}

}

void myFree ( node* top )
{
node* tmp;
tmp = top;

while ( top->next != NULL ) {
tmp = top->next;
free(top);
top = tmp;
}
}
node *duplica(node *l1,node *l2,int pos){
node *p;

if(pos%2!=0){
p=newnode();
p->data=l1->data;
p->next=duplica(l1->next,l2->next,pos+1);
}

else

{
p=newnode();
p->data=l2->data;
p->next=duplica(l1->next,l2->next,pos+1);
return p;}

return duplica(l1->next,l2->next,pos+1);


}



int main()
{
node* head;node* head2;node *dup;

printf ("-----LISTA A-----\n");
head = buildlis ( );
printf ("-----LISTA B-----\n");
head2 = buildlis ( );


printf ("\n-----STAMPA LISTA A-----\n");
printlis(head);
printf ("\n-----STAMPA LISTA B-----\n");
printlis(head2);

printf ("\n-----CONTROLLO-----\n");
int som=0;
dup=duplica(head,head2,1);
printlis(dup);

free ( head );


return 0;
}


------


node *duplica(node *l,int pos){
node *p;
if(l==NULL) return NULL;


if(pos%2!=0){


p=newnode();
p->data=l->data;
p->next=duplica(l->next,pos+1);
return p;}
return duplica(l->next,pos+1);

}

gabama
09-03-2009, 17:32
nessuno mi può dare un consiglio?

Loading