Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [c] confrontaliste

  1. #1
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803

    [c] confrontaliste

    questo esercizio mi ha spiazzato un pò..praticamente non saprei da dove cominciare

    codice:
     
    typedef struct nodo *lista; 
    typedef struct nodo {
    		int val;
    		lista next;
    }nodo;
    
    /* Function:  confrontaListe
     * Usage: L = confrontaListe (L1, L2, &n)
     * -----------------------------------------------
     * Confronta uno ad uno gli elementi corrispondenti delle due liste L1 e L2, che devono 
     * avere uguale lunghezza, costruendo una nuova lista L che contiene gli  elementi
     * corrispondenti che risultano uguali. Se L1 e L2 hanno lunghezza diversa,  
     * restituisce NULL. Il parametro di output n conta il numero di elementi corrispondenti  
     * uguali 
     */
    ho pensato, scorro le due liste contemporaneamente:
    codice:
    lista confrontaListe(lista L1, lista L2, int *n)
    {
    nodo *corrente1;
          nodo *precedente1;
          nodo *corrente2;
          nodo *precedente2;
          while (corrente1==NULL&&corrente2==NULL){
                precedente1=corrente1;
                precedente2=corrente2;
                corrente1=corrente1->next;
                corrente2=corrente2->next;
                if (corrente1->val==corrente2->val){
                 //appendi nodo alla nuova lista
                 //incrementa n (non so come)
               }}
                }

    la strada è giusta?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Mi sembra di sì, anche se forse potrebbe semplificarsi un po' il codice.

    E' un po' che non tratto liste in C e potrei aver fatto qualche sciocchezza (anche se ho provato la funzione e funge...) comunque ho scritto questo codice di esempio

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    struct nodo {
         char c;
         struct nodo *next;
    };
    
    typedef struct nodo NODO;
    
    typedef NODO * LINK;
    
    LINK visita(LINK lista1, LINK lista2, int *n) { /*n viene passato per riferimento e ha valore 0*/
    
         LINK temp1 = lista1;
         LINK temp2 = lista2;
    
         LINK nuova_lista = (LINK) malloc(sizeof(NODO));
    
         /* poiché le liste hanno uguale lunghezza e poiché vengono scorse parallelamente,
            finita l'una sarà finita necessariamente anche l'altra, quindi eseguo il controllo
            solo su una di esse */
         while ( temp1 != NULL ) {
    
              if ( temp1->c == temp2->c ) {
    
                      if ( *n == 0 )
    
                         nuova_lista = temp1;
    
                      else
    
                         nuova_lista->next = temp1;
    
                      *n = *n + 1;
              }
    
              temp1 = temp1->next;
              temp2 = temp2->next;
         }
    
         return nuova_lista;
    }

  3. #3
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    scusami ma volendo usare il tuo codice è sbagliato dichiarare una lista così
    LINK listauno={'a', 'd', 'e'};

    xke mi da errore?

    "initializer for scalar variable requires one element "

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Ora che rileggo non è detto che le liste abbiano uguale lunghezza, e anzi se non ce l'hanno la funzione deve restituire NULL... si potrebbe risolvere aggiungendo un controllo del genere

    codice:
              ...
              temp1 = temp1->next;
              temp2 = temp2->next;
    
              if ( (temp1 == NULL && temp2 != NULL)  || (temp1 != NULL && temp2 == NULL) ) {
                 nuova_lista = NULL;
                 break;
              }

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da ant_alt
    scusami ma volendo usare il tuo codice è sbagliato dichiarare una lista così
    LINK listauno={'a', 'd', 'e'};

    xke mi da errore?

    "initializer for scalar variable requires one element "
    Scusa ma LINK è un puntatore alla struttura nodo... come puoi dichiararlo così?

  6. #6
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    Originariamente inviato da YuYevon
    Ora che rileggo non è detto che le liste abbiano uguale lunghezza, e anzi se non ce l'hanno la funzione deve restituire NULL... si potrebbe risolvere aggiungendo un controllo del genere

    codice:
              ...
              temp1 = temp1->next;
              temp2 = temp2->next;
    
              if ( (temp1 == NULL && temp2 != NULL)  || (temp1 != NULL && temp2 == NULL) ) {
                 nuova_lista = NULL;
                 break;
              }
    certo, non ti ho corretto xke questo è decisamente secondario


    Originariamente inviato da YuYevon
    Scusa ma LINK è un puntatore alla struttura nodo... come puoi dichiararlo così?
    so che era sbagliato, quindi come si dichiara?

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.