Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760

    Duplicazione liste in c tramite ricorsione

    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

    codice:
    #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;
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    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

    codice:
    #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;
    }
    ------

    codice:
    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);
    
            }

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    nessuno mi può dare un consiglio?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.