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

    Ancora problema lista in c

    Ho 2 liste e vorrei fargli controllare (tramite una funzione) se contengono gli stessi elementi,e che mi ritorni 1 se è così ,0 viceversa
    es l1 1--2--3
    l2 3--2--1 mi ritorni 1 perchè gli elementi sono gli stessi,solo in ordine diverso
    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;
        }
    }
    
    
    int uguali(node *l1,node *l2)
    
    {
    int vl=0;
    int ug=0;
    
       while((l1!=NULL) &&(l2!=NULL)) {
            if (l1->data==l2->data){
            ug=ug+1;
            vl=vl+1;
            }else (vl=vl+1);
    
            l2=l2->next;l1=l1->next;
        }
    
    
    
         printf("\nvalori %d e uguali %d",vl,ug);
            if(vl==ug) return 1;
            else return 0;
    
        }
    
    
    
    
    
    
    
    
    int main()
    {
        node* head;node* head2;
        int m=6;
        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-----STAMPA LISTA A MODIFICATA-----\n");
        int n=3;int uguale=0;
        uguale=uguali(head,head2);
        if(uguale==1)printf("\nUguali ");
        else printf("\nDiversi ");
        myFree ( head );
        return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Guarda ... tu sbagli a proporre il testo di un esercizio e il tuo codice senza dare altre indicazioni.

    Dovresti fare una domanda precisa, che so

    1) il programma non funziona perche' non da' i risultati corretti se inserisco questi dati ...

    2) in compilazione ho un determinato errore in una tale riga ...

    3) quando eseguo il programma, in una determinata fase, si arresta con un errore ...

    Se non poni il quesito in questi termini, cosa vuoi che si faccia?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    inserendo 1 -- 2 -- 3 e 3 -- 2 -- 1
    mi da valori 3 (ed è giusto) ma uguali 1 e non lo è.L' errore è ovviamente nella funzione uguali.Con ogni probabilità il ciclo è creato male ,nel senso che non "gira" e itera come dovrebbe.Come lo posso modificare?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ecco ... cosi' va molto meglio, la domanda e' chiara e si individua subito la parte di codice da rivedere senza tanta difficolta' ed e' possibile che qualcuno ti risponda ...

    Nella funzione uguali devi prevedere 2 cicli e non uno solo.

    Nel primo esterno, scorri la lista A, prendendo un elemento per volta che passerai all'interno del ciclo interno in cui scorri la lista B e in cui confronti l'elemento di A con TUTI quelli di B.

    Nel secondo passo, confronterai il secondo elemento di A con TUTTI quelli di B e così via.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    ti ringrazio oregon,e provo a postare solo il pezzo della funzione,perchè essendo agli inizi lo so a parole,ma ho problemi a volte a scriverlo.....
    codice:
    int uguali(node *l1,node *l2)
    
    {
    int vl=0;
    int ug=0;
    
       while(l1!=NULL) l1=l1->next; {
            while (l2!=NULL) l2=l2->next; {
            if (l1->data==l2->data) ;{
            vl=vl+1;ug=ug+1
            }
            }
    
        }
        }

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    prima non ho potuto testare il nuovo codice,ma adesso mi dà valori 1 e uguali 1 e quindi c' è ancora un problema.....
    codice:
    int uguali(node *l1,node *l2)
    
    {
    int vl=0;
    int ug=0;
    
       while(l1!=NULL) l1=l1->next; {
            while (l2!=NULL) l2=l2->next; {
            if (l1->data==l2->data) ;{
            vl=vl+1;ug=ug+1;
            }
            }
    
        }
    
    
    
    
         printf("\nvalori %d e uguali %d",vl,ug);
            if(vl==ug) return 1;
            else return 0;
    
        }

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma come sono scritti i while

    while(l1!=NULL) l1=l1->next; {


    while (l2!=NULL) l2=l2->next; {


    ???

    E soprattutto, devi porre attenzione al fatto che la ricerca nel secondo ciclo deve ricominciare sempre dal primo elemento ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    sono agli inizi e ti chiedo se puoi ,e ,se hai soprattutto tempo e voglia di darmi un consiglio diretto su come trasformare il codice per farlo funzionare

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da gabama
    sono agli inizi e ti chiedo se puoi ,e ,se hai soprattutto tempo e voglia di darmi un consiglio diretto su come trasformare il codice per farlo funzionare
    Il tempo si trova, ma sappi che cosi' non imparerai a programmare ... anche se sei agli inizi (come tutti), anzi a maggior ragione che sei agli inizi, bisogna "sbatterci" la testa, magari applicando dei "consigli" (che ti ho dato) ma provandoci da solo ...

    codice:
    int uguali(node *l1,node *l2)
    {
      int vl=0;
      int ug=0;
      node *tmp;
    
      while(l1)
      {
        tmp=l2;
        while(tmp)
        {
          if (l1->data==tmp->data)
            ug=ug+1;
    
          tmp=tmp->next; 
        }
    
        vl=vl+1;
        l1=l1->next;
      }
    
      printf("\nvalori %d e uguali %d",vl,ug);
    
      if(vl==ug) return 1;
      else return 0;
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    mi rendo conto che per imparare bisogna provare,infatti il 90% delle cose che ho imparato sul pc le ho fatte per conto mio,ma in questo caso dopo aver provato e riprovato per continuare e magari a mettermi in testa idee sbagliate ho preferito chiedere.Avevo fatto una cosa analoga con gli array,ma nelle liste mi ero un pò fermato.....
    Comunque grazie mille per il codice
    Ciao

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 © 2025 vBulletin Solutions, Inc. All rights reserved.