Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Liste in c

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760

    Liste in c

    Ho un problema con 2 liste in c,dovrei fare la differenza tra gli elementi di una meno l' altra e generarne un 'altra,fino a qui tutto bene,ma quando una è pù breve dell' altra come posso fare per evitare di generare 2 funzioni come ho fatto in questo caso?Perchè se l1 è minore di l2 mi deve dare il valore negativo
    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<=0)
    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:\n");
    scanf("%d", &x);
    while (x>0)
    /* 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:\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) && (somma=somma+tmp->data) && (conteggio=conteggio+1) ;
               tmp = tmp->next;
    
         }
    printf("Somma %d\n",somma);
    
    printf("Conteggio %d \n",conteggio);
    media=(somma/conteggio);
    printf("Media %f",media);
    }
    
    
    void myFree ( node* top )
    {
        node* tmp;
        tmp = top;
    
        while ( top->next != NULL ) {
              tmp = top->next;
              free(top);
              top = tmp;
        }
    }
    
    node *duplist1(node *l)
    {
        node *p,*head,*tail;
        head=NULL;
        while (l != NULL)
    {
        p=newnode();
        p->data = l->data;
        p->next = NULL;
        if (head == NULL)
    {   head=p; tail=p;}
        else {tail->next=p; tail=tail->next;}
        l=l->next;
    }
    return head;
    }
    
    node *duplist2(node *l)
    {
        node *p,*head,*tail;
        head=NULL;
        while (l != NULL)
    {
        p=newnode();
        p->data = -l->data;
        p->next = NULL;
        if (head == NULL)
    {   head=p; tail=p;}
        else {tail->next=p; tail=tail->next;}
        l=l->next;
    }
        return head;
    }
    
    node *duplica(node *l1, node *l2)
    {
        node *p, *head, *tail;
        head=NULL;
        while ((l1 != NULL) && (l2 != NULL))
    {
        p=newnode();
        p->data = l1->data-l2->data;
        p->next = NULL;
        if (head == NULL){head=p; tail=p;}
        else {tail->next=p; tail=tail->next;}
        l1 = l1->next;
        l2 = l2->next;
    } if ((l1 == NULL) && (l2 == NULL)) return head;
        else if (l1 == NULL)
    {   tail->next=duplist2(l2); return head;}
        else {tail->next=duplist1(l1); return head;}
    }
    
    
    
    
    
    int main()
    {
        node* head;node* head2;node *dup;
        int n;int m=6;
        printf ("\n-----LISTA A-----\n");
        head = buildlis (  );
        printf ("\n-----LISTA B-----\n");
        head2 = buildlis (  );
        printf ("\n-----STAMPA LISTA A-----\n");
        int a=3;
        printlis(head);
        printf ("\n-----STAMPA LISTA B-----\n");
        printlis(head2);
        printf ("\n-----STAMPA LISTA A MODIFICATA-----\n");
        dup=duplica(head,head2);
        printlis(duplica(head,head2));
        myFree ( head );
        return 0;
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    nessuno mi può dare consigli?

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Forse non ti ha risposto nessuno perchè le tue spiegazioni non sono chiare ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    il mio problema è che se una lista termina prima dell' altra come potevo fare per non che l' operazione di copiatura si interrompesse.Ho risolto così,funziona,ma è corretto sintatticamente?
    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) && (somma=somma+tmp->data) && (conteggio=conteggio+1) ;
               tmp = tmp->next;
    
         }
    printf("Somma %d\n",somma);
    
    printf("Conteggio %d \n",conteggio);
    media=(somma/conteggio);
    printf("Media %f",media);
    }
    
    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)
    {
        node *p, *head, *tail;
        head=NULL;
        while ((l1 != NULL) && (l2 != NULL))
    {
        p=newnode();
        p->data = l1->data-l2->data;
        p->next = NULL;
        if (head == NULL){head=p; tail=p;}
        else {tail->next=p; tail=tail->next;}
        l1 = l1->next;
        l2 = l2->next;
    }   if ((l1 == NULL) && (l2 == NULL)) return head;
        else if (l1 == NULL)
    {   while (l2 != NULL)
    {
        p=newnode();
        p->data = -l2->data;
        p->next = NULL;
        if (head == NULL)
    {   head=p; tail=p;}
        else {tail->next=p; tail=tail->next;}
        l2=l2->next;
    }
        return head; }
        else (l2 == NULL);{while (l1 != NULL)
    {
        p=newnode();
        p->data = l1->data;
        p->next = NULL;
        if (head == NULL)
    {   head=p; tail=p;}
        else {tail->next=p; tail=tail->next;}
        l1=l1->next;; return head;}
    }
    
    }
    
    
    int main()
    {
        node* head;node* head2;node *dup;
        int n;int m=6;
        printf ("-----LISTA A-----\n");
        head = buildlis (  );
        printf ("\n-----LISTA B-----\n");
        head2 = buildlis (  );
        printf ("\n-----STAMPA LISTA A-----\n");
        int a=3;
        printlis(head);
        printf ("\n-----STAMPA LISTA B-----\n");
        printlis(head2);
        printf ("\n-----STAMPA LISTA A MODIFICATA-----\n");
        dup=duplica(head,head2);
        printlis(duplica(head,head2));
        myFree ( head );
        return 0;
    }

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.