Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C] Richiesta commenti per 2 funzioni sulle liste

    Ciao a tutti, avrei un po di difficoltà nella comprensione delle
    liste. Posto qui un pezzo di programma, affinchè qualcuno mi possa
    gentilmente commentare riga per riga le due funzioni list_add e
    list_remove sperando cosi di capirci qualcosa di più...Vi ringrazio
    fin da adesso...

    /* STRUTTURA GLOBALE */


    typedef struct ns {
    int data;
    struct ns *next;


    } node;


    .........

    /* FRAMMENTO DI FUNZIONE MAIN */


    int main(void) {
    node *n = NULL;


    list_add(&n, 0); /* lista: 0 */
    list_add(&n, 1); /* lista: 1 0 */
    list_add(&n, 2); /* lista: 2 1 0 */
    list_add(&n, 3); /* lista: 3 2 1 0 */
    list_add(&n, 4); /* lista: 4 3 2 1 0 */
    list_print(n);
    list_remove(&n); /* rimuove il primo elemento (4) */
    list_remove(&n->next); /* rimuove il nuovo secondo (2) */
    list_remove(list_search(&n, 1)); /* rimuove la cella che contiene
    1 (primo) */
    list_remove(&n->next); /* rimuove il successivo (0) */
    list_remove(&n); /* rimuove l'ultimo (3) */


    .......


    /* AGGIUNGO UN ELEMENTO ALLA LISTA */


    node *list_add(node **p, int i) {
    node *n = malloc(sizeof(node)); /* alloco memoria */
    n->next = *p;
    *p = n;
    n->data = i;
    return n;



    }


    /* RIMUOVO ELEMENTO */

    void list_remove(node **p) { /* rimuove head */
    if (*p != NULL) {
    node *n = *p;
    *p = (*p)->next;
    free(n);
    }

  2. #2

    Re: [C] Richiesta commenti per 2 funzioni sulle liste

    Originariamente inviato da Dario86ostia

    Codice PHP:
    typedef struct ns 
            
    int data
            
    struct ns *next


    node


    /*una volta definita una struttura di riferimento per il nodo e' di solito consigliabile usare delle typedef . . . (di fatto non cambia nulla lo si fa per maggiore chiarezza)*/

        
    node *NULL/*testa della lista . . . che ovviamente e' NULL dato che la lista all'inizio e' vuota*/

    int main(void) { 
        
    list_add(&n0); /* passo alla funzione l'indirizzo di un puntatore e il valore da inserire nel campo data del nodo */ 
        /* lista: 0->NULL */
        
    list_add(&n1); /* lista: 1->0->NULL */ 
        
    list_add(&n2); /* lista: 2->1->0->NULL */ 
        
    list_add(&n3); /* lista: 3->2->1->0->NULL */ 
        
    list_add(&n4); /* lista: 4->3->2->1->0->NULL*/ 
        
    list_print(n); 
        
    list_remove(&n);            /* rimuove l'elemento che si trova in testa in questo caso il 4 */ 
        
    list_remove(&n->next);      /* rimuove il nuovo secondo (2) */ 
        
    list_remove(list_search(&n1)); /* rimuove la cella che contiene 
    1 (primo) */ 
        
    list_remove(&n->next);      /* rimuove il successivo (0) */ 
        
    list_remove(&n);            /* rimuove l'ultimo (3) */ 


    ....... 


    /* AGGIUNGO UN ELEMENTO ALLA LISTA */ 

    /*da come e' impostata la funzione e il main in cui viene invocata non ha senso restituire un valore !*/
    void (node **pint i) { /*la funzione riceve un puntatore ad un puntatore e il dato da inserire*/
        
    node *malloc(sizeof(node)); /* raggiungo l'area di memoria del puntatore n (che da qui in poi non avra lo stesso valore di *p) e gli assegno il valore del puntatore restituito dalla malloc per allocare un nuova area di memoria della dimensione del nodo */ 
        
    n->next = *p/*raggiungo attraverso il puntatore alla struttura il puntatore al suo interno assegnandoli il valore a cui sta puntando la testa*/
        
    *n/*mentre l'attuale testa la faccio puntare al nuovo elemento creato*/
        
    n->data i/*raggiungo tramire il puntatore il campo data nel nodo inserendo il valore ricevuto*/



    /* RIMUOVO ELEMENTO */ 

    void list_remove(node **p) { /* rimuove l'attuale elemento in posizione di testa*/ 
        
    if (*!= NULL) { /*controlla se la lista e' vuota*/
           /*prima di libera l'area di memoria relativa al nodo devi salvare i collegamenti tra i nodi "bypassandoli"*/
            
    node *= *p;
            *
    = (*p)->next
            
    free(n); 
        } 
        else 
    printf("\nImpossibile Eliminare ! LISTA VUOTA!\n"); 

    spero di non aver commesso errori nel commentare il codice. . . (e' anche l'una meno un quazzo)

    Se una funzione riceve come argomento un puntatore di puntatore di puntatore quando la invochi ricordati che puo ricevere o un puntatore di puntatore di puntatore o l'indirizzo di un puntatore di puntatore

  3. #3
    Grazie!!!!

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