Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65

    [C] modificare testa lista con void

    Ciao a tutti ho il seguente problema con la VOID: data una lista L1 voglio modificare SOLTANTO la testa se è pari.
    codice:
    struct elemento 
      {
       int inf;
       struct elemento *next;
      };
    void MODIFICA(struct elemento *L1)
    {
      struct elemento *app;
      if (L1->inf % 2 == 0)
            {
              printf("testa pari \n");
              app = (struct elemento *)malloc(sizeof(struct elemento));
              app->inf = (L1->inf * 2);
              app->next = L1;
              L1 = app; /*aggiorniamo la testa*/
              printf("L1 ->inf e' %d \n",L1->inf);
            } 
      return;  
    }
    In output mi da sempre la stessa lista anke se la testa è pari. Senza usare la void lo so risolvere, ma io non ho capito perche fatta con la void non funziona??
    SAPETE DIRMI PERCHè ????? grazie in anticipo

    PS ho messo le printf perche nella funzione la modifica la testa, come potete accertare anke voi, ma nel main quando vado a visualizzare la lista la stampa uguale a come era prima.

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Forse sarebbe meglio usare un puntatore a puntatore come parametro della funzione Modifica.
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    Originariamente inviato da linoma
    Forse sarebbe meglio usare un puntatore a puntatore come parametro della funzione Modifica.
    grazie della risposta, ma non ho capito perchè? sapresti dirmelo?

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Perché quando lo passi alla funzione viene copiato, quindi la funzione non modifica quello originale.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Puoi anche strutturare la tua lista prevedendo un "nodo sentinella"

    http://en.wikipedia.org/wiki/Linked_...sentinel_nodes

    cioè di fatto un nodo che costituisce la testa "fisica" della lista pur senza farne realmente parte. In questo modo, ciascun nodo della lista (compresa la testa) sarà sempre il "nodo prossimo" di un altro nodo, eliminando di fatto l'anomalia dell'inserimento in testa della lista e la necessità di modificare la firma della funzione di modifica introducendo come parametro un doppio puntatore. Ovviamente la presenza di un nodo sentinella richiede inevitabilmente altro spazio in memoria: questo potrebbe essere poco conveniente nel caso in cui dovessi gestire molte liste di pochi nodi, pertanto fai le tue considerazioni.

    Un'altra soluzione potrebbe consistere nel definire un tipo "lista" come un contenitore avente, tra gli altri, un campo "testa": in questo modo alle varie funzioni che operano sulla lista puoi passare un puntatore (singolo) a questo contenitore e poi eventualmente modificarne il puntatore alla testa internamente.

    Un esempio rapido e non testato (per rendere il concetto), riadattando il tuo codice:

    codice:
    typedef struct _elemento {
       int inf;
       struct _elemento *next;
    } _elemento;
    
    typedef struct lista {
        _elemento *testa;
        /* eventuali altri campi, ad esempio... */
        _elemento *coda;
        int n_elementi;
    } lista;
    
    ...
    
    void MODIFICA(lista *L1)
    {
      _elemento *app;
      if (L1->testa->inf % 2 == 0)
            {
              printf("testa pari \n");
              app = (_elemento *)malloc(sizeof(_elemento));
              app->inf = (L1->testa->inf * 2);
              app->next = L1->testa;
              L1->testa = app; /*aggiorniamo la testa*/
              printf("L1->testa->inf e' %d \n",L1->testa->inf);
            } 
      return;  
    }
    every day above ground is a good one

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    ragazzi sapreste dirmi come modificare il codice per usare i puntatori a puntatori. Ci sto provando da un sacco di tempo ma non ci riesco. GRAZIE in anticipo

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590

    Re: [C] modificare testa lista con void

    codice:
    struct elemento 
      {
       int inf;
       struct elemento *next;
      };
    void MODIFICA(struct elemento **L1)
    {
      struct elemento *app;
      if ((*L1)->inf % 2 == 0)
            {
              printf("testa pari \n");
              app = (struct elemento *)malloc(sizeof(struct elemento));
              app->inf = ((*L1)->inf * 2);
              app->next = (*L1);
              (*L1) = app; /*aggiorniamo la testa*/
              printf("L1 ->inf e' %d \n",L1->inf);
            } 
      return;  
    }
    e chiami la funzione con
    codice:
    MODIFICA(&L1);
    ho scritto dal telefono, potrebbe esserci qualche errore...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    grazie mille, ora ho letto il messaggio lo proverò subito e ti faccio sapere

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    Funziona perfettamente. solo la printf della testa bisogna mettere l asterisco:

    printf("L1 ->inf e' %d \n",(*L1)->inf);

    GRAZIE MILLE DI NUOVO. ciao a tutti

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.