Liste concatenate

di il
4 risposte

Liste concatenate

Salve ragazzi ,
sto facendo esercizi sulle linked lists. Fino ad oggi per semplicità ho usato una variabile globale head di tipo Struct Nodo. Ho scoperto però che il professore non accetta variabili globali. Mi chiedevo se fosse possibile creare funzioni per aggiungere nodi o cancellarli di tipo void! Vi ringrazio

4 Risposte

  • Re: Liste concatenate

    Usa i puntatori.


    P.S. Python si scrive con l' h
  • Re: Liste concatenate

    La funzione per aggiungere può essere benissimo di tipo void ,forse il tuo problema é forse di non avere variabili globali? Allora passa il puntatore alle funzioni ed aggiornalo quando é necessario.
  • Re: Liste concatenate

    Ciao di nuovo, vi aggiorno. Sono riuscito a fare la mia funzione di tipo void per aggiungere i nodi di una lista. Ora l'esercizio chiede di cancellare tutte le occorrenze di una chiave data.
    Il problema è che mi da segmentation fault. Ho provato a fare qualche prova printeffando qua e la ma nn ne arrivo a capo.. Vi lascio il codice sperando che qualcuno trovi l'inghippo (il codice e pieno di commenti, nella speranza di semplificarvi la vita ). Un grazie in anticipo.
    //cancella tutte le occorrenze della chiave data da una lista
    #include <stdio.h>
    #include <stdlib.h>
    
    struct Nodo{
        int data;
        struct Nodo *next, *prev;
    };
    typedef struct Nodo nodo;
    
    void CancellaTutto();
    void CancellaPrimo(nodo**);
    void CancellaUltimo();
    void Insert(nodo** ptr, int data);
    void Print(nodo*);
    
    int main(){
    
        nodo* head = NULL;
        Insert(&head,1);
        Insert(&head,2);
        Insert(&head,3);
        Insert(&head,5);
        Print(head);
        CancellaTutto(&head,5);
        Print(head);
    
    return 0;
    }
    
    void CancellaTutto(nodo** head, int data){
        nodo *p = *head;        //p punta all'indirizzo di head
        nodo *t;
        nodo* c = *head;
        /*if(*head == NULL);{
            printf("La lista e vuota");
            exit(0);}*/
    
        while(c->data == data){ //finche il primo della lista e uguale a data cancellalo e fai puntare head al nodo successivo
            CancellaPrimo(head);
            c = *head;}         //C Punta solo al primo della lista nn lo incremento
    
            p = c->next;        //c e la testa senza la chiave....continuo la ricerca dal successivo
        while(p ->next != NULL){       //(se arriva qui vuol dire che il primo della lista non contiene la chiave). Finche
                                //il successivo a p nn e nullo
    
            if(p->data == data){   //se p contiene data cancellalo e collega il precedente al successivo
                t = p->next;
                p->prev->next = t;
                t->prev = p->prev;
                free(p);
                p = t;}         //ora p punta a t (quello che ho impostato successore del vecchio p)
            else
                p = p->next;} /*  //se p nn contiene data p punta al successivo
    
            if(p->next == NULL && p->data == data){ //se l ultimo nodo contiene data
                t = p->prev;
                printf("%d",t->data);
                free(p);        //t punta al precedente di p. Cancello p e faccio puntare a t NULL
                t->next = NULL;}*/
    }
    
    
    void CancellaPrimo(nodo** head){
        nodo* p = *head;    //p e un puntatore di tipo nodo che memorizza l indirizzo del puntatore head
                            //(p ora contiene l indirizzo di head)
    
        nodo* n = *head;    //n ora contiene l idirizzo di head
        n = n->next;        //n ora punta all indirizzo del nodo successivo a head
        /*free(p->data);*/  //perche mi da errore?
        free(p);
        *head = n;          //ora head punta al successivo
    }
    
    void Insert(nodo** ptr, int data){
        nodo* temp = (nodo*)malloc(sizeof(nodo));
        temp->data = data;
        temp->next = NULL;
    
        if(*ptr==NULL){
            *ptr = temp;}
    
        else{
            nodo* temp1 = *ptr;
            while(temp1->next != NULL)
                temp1= temp1->next;
            temp1->next = temp;}
    }
    
    void Print(nodo* head){
        nodo* temp = head;
        while(temp != NULL){
            printf("%d ",temp->data);
            temp = temp->next;}
        printf("\n");
    }
    
  • Re: Liste concatenate

    All'inizio hai scritto

    void CancellaTutto();

    che è ovviamente sbagliato, ma non ho notato il problema che hai detto ...
Devi accedere o registrarti per scrivere nel forum
4 risposte