Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    14

    [C] implementazione lista

    Ciao a tutti uso Xcode,stavo provando ad implementare una lista con nodo fittizio in testa, mi sono però arenato con la funzione di insert() che non ne vuole sapere di funzionare,lanciando il main mi stampa LISTA VUOTA. Dove sbaglio? Non vorrei fosse colpa di xcode ma non credo...

    main.c
    codice:
    #include <stdio.h>
    #include "Lista.h"
    
    int main (int argc, const char * argv[])
    {
        printf("Testiamo la nostra bella lista!\n");
        link listatest=initialize(0);
        insertNext(newNode(24), listatest);
        insertNext(newNode(32), listatest);
        print(listatest);
        return 0;
    }
    lista.h

    codice:
    typedef int item;
    
    struct node{
        item it;
        struct node* next;
    };
    
    typedef struct node node;
    typedef node* link;
    
    link initialize(int x);
    link newNode(item x);
    void freeNode(link x);
    void insertNext(link x,link head);
    link deleteNext(link x,link head);
    link search(item x,link head);
    int count(link head);
    void print(link head);
    list.c

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include "Lista.h"
    
    link initialize(int x){
        link head=malloc(sizeof(node));
        head->it=0;
        head->next=NULL;
        return head;
    }
    
    link newNode(item x){
        link t=malloc(sizeof(node));
        t->it=x; t->next=NULL;
        return t;
    }
    
    void insertNext(link x,link head){ 
        link t=head->next;    //QUESTA è LA PROCEDURA INCRIMINATA
        while (t!=NULL) {
            t=t->next;
        }t=x;
    }
    
    void print(link head){
        if (head==NULL) {
            printf("attenzione lista mancante");
        }
        if (head->next==NULL) {
            printf("LISTA VUOTA");
        }
        link t=head->next;
        while (t!=NULL) {
            printf("%d ",t->it);
            t=t->next;
        }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    14
    Allora ho provato ad usare la console di debug e la cosa anomala di questa funzione:
    codice:
    void insertNext(link x,link head){ 
        link t=head->next;    //QUESTA è LA PROCEDURA INCRIMINATA
        while (t!=NULL) {
            t=t->next;
        }t=x;
    }
    è che all'uscita dal while con l'assegnamento t=x l'indirizzo di t viene giustamente modificato e diventa x, ma se guardo head->next rimane invariato... essendo t=head->next non dovrebbe modificarsi automaticamente anche head->next essendo puntatori??

  3. #3
    Riscriverei il codice così:
    codice:
    void insertNext(link x,link head){ 
        link t=head;    //t prima puntava al contenuto di next (NULL)
        while (t->next!=NULL) { 
            t=t->next;
        }t->next=x;
    }
    Riscrivi anche print perché salti il primo nodo.

    Modifica messaggio precedente:
    non leggere da qui in poi, prima ho scritto baggianate
    Esatto, lì devi usare un puntatore.
    Prima di t=x i puntatori t ed head->next puntano a Null, poi solo t all'indirizzo giusto.
    Per cambiare anche head->next devi fare in modo che t contenga l'indirizzo di next.

    codice:
    void insertNext(link x,link head){ 
        link *t=&head->next;    //t punta a next, prima puntava al contenuto di next (NULL)
        while (*t!=NULL) { 
            t=*t->next;
        }*t=x;
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    14
    Clynamen non capisco bene perché fai ricorso a puntatore a puntatore nella tua soluzione nel senso link è già un node* quindi link* t è come dire node** t giusto? Io ho risolto così:
    codice:
    void insertNext(link x,link head){
       while (head->next!=NULL) {head=head->next;}
       head->next=x;
    }
    il problema è che non capisco perché in questo modo funzioni e come prima invece no possibile che il semplice assegnamento t=head->next; poi non faccia andare più le cose come dovrebbero?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    14
    Come non detto ho capito ho letto la tua modifica al messaggio Clynamen Grazie ancora, mi pareva strana la storia del puntatore a puntatore

  6. #6
    lynamen non capisco bene perché fai ricorso a puntatore a puntatore
    Sì, infatti mi ero corretto sopra, avevo scritto una grande ca...a XD.

    possibile che il semplice assegnamento t=head->next; poi non faccia andare più le cose come dovrebbero?
    Sì, perché tu modifichi t, head->next continua a puntare a Null.

    codice:
    void insertNext(link x,link head){ 
    // esempio: iniziamo con una lista vuota.
     //head punta ad un indirizzo, head->next a NULL
        link t=head->next;  // Ora t punta allo stesso indirizzo di next, ovvero NULL
        while (t!=NULL) { //falso
            t=t->next; 
        }t=x; // Qui t punta allo stesso indirizzo di x, head->next continua a puntare a NULL
    }

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.