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

    Passaggio per riferimento liste in c

    Vorrei eseguire questa funzione che mi cancelli alcune occorrenze,ma dovendola passare per riferimento non so come fare.Sono nuovo sulle liste.....consigli.....?
    codice:
    #include <stdlib.h>
    #include <stdio.h>
    
    typedef struct nod {
            int data;
            struct nod *next;
    } 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_n (int n)
    {
        node *p, *lis;
        lis=NULL;
        while (n>0) {
              p=newnode();
              p->data=n;
              p->next=lis;
              lis=p;
              n--;
        }
        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;
         printf("\nlista risultato\n");
         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;
        }
    }
    
    void cancella(int x, node **lis)
    {
            node *p,*head;
            if (lis != NULL)
    {
        head=*lis;
        while (head->next != NULL)
    {
    if (head->next->data==x)
    {
        p=head->next;
        head->next=head->next->next;
        free(p);
    }
        else head=head->next;
    }
        if ((*lis)->data==x) *lis=(*lis)->next;
    }
    }
    
    int main()
    {
        node* head;node* head2;
        int n;int m=6;
    
        printf ("Inserire valore: \n");
        scanf  ("%d", &n);
    
        head = buildlis_n ( n );
       
    
        printf ("\n-----CONTROLLO-----\n");
        cancella(3,head);
        myFree ( head );
        
    
        return 0;
    }

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

  3. #3
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    bhè...sembra che l'implementazione sia corretta apparte qualcosina dei puntatori; infatti qua:
    codice:
    cancella(3,&head);
    se tu passi per riferimento, devi passare l'indirizzo di head...e poi nella funzione cancella (), devi hai dimenticato un asterisco:
    codice:
    if ((*lis) != NULL)
    comunque sembra che funzioni...apparte forse nel caso in cui la lista è di un solo elemento e quindi devi cancellare per forza quello e la lista diventa vuota!..prova un pò!
    ciao
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

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.