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

    [c]liste con doppi puntatori funzionante

    Ciao a tutti, premesso che circa un paio di settimana addietro, avevo postato la richiesta di aiuto per risolvere l'implementazione di liste con doppio puntatore. Purtroppo nn ho avuto modo di risp prima per problemi alla connessione, uso un adsl ad onde radio, con parabola, ed aimè ultimamente stò avuto numerosi inghippi, causa maltempo.

    Cmq voglio ringraziare Marco1995 che mi aveva suggerito la soluzione al problema, quindi GRAZIE.

    Al comtempo inserisco il codice corretto, in modo tale che possa essere di aiuto anche ad altri!!!

    codice:
    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    #define TRUE 1
    #define FALSE 0
    
    struct list{
    int valore;
    struct list *next;
    
    };
    
    typedef char bool;
    int menu (void);
    void init(struct list **ptrptr);
    void ins_testa(struct list **ptrptr,int valore);
    bool can_testa(struct list **ptrptr); //non funziona dato che va in loop il sistema
    void ins_coda(struct list **ptrptr,int valore);
    void ord_ins(struct list **ptrptr,int valore);
    bool cerca (struct list *ptr,int valore,struct list **ptrptr);
    void stampa (struct list *ptr);
    int somma (struct list *ptr);
    int lunghezza(struct list *ptr);
    
    
    int main(){
    
        int scelta,valore,y,x;
    
        bool a,b;
        struct list *ptr_lista;
        struct list **ptrptr;
    
        init(&ptr_lista);
    
        while(scelta=menu()){
            switch(scelta){
    
        case 1:
    
            system("CLS");
            printf("INSERIMENTO IN TESTA\n");
            printf("Inserisci ora il valore che desideri:    ");
            scanf("%d",&valore);
            ins_testa(&ptr_lista,valore); 
            break;
    
    
         case 2:
    
            system("CLS");
    
            printf("CANCELLAZIONE IN TESTA\n");
    
            a=can_testa(&ptr_lista);
    
            if(a==TRUE)
                printf("Elemento cancellato con successo\n\n");
            else
                printf("Nessun elemento da cancellare, lista vuota!!\n\n");
    
            break;
    
         case 3:
    
            system("CLS");
    
            printf("INSERIMENTO IN CODA\n");
            printf("Inserisci ora il valore che desideri:    ");
            scanf("%d",&valore);
    
            ins_coda(&ptr_lista,valore);
    
            break;
    
         case 4:
    
            system("CLS");
    
            printf("INSERIMENTO IN ORDINE\n");
            printf("Inserisci ora il valore che desideri:    ");
            scanf("%d",&valore);
    
            ord_ins( &ptr_lista,valore );
    
    
            break;
    
         case 5:
    
            system("CLS");
    
            printf("RICERCA DI UN ELEMENTO\n");
            printf("Inserisci ora il valore che desideri cercare:    ");
            scanf("%d",&valore);
            b=(ptr_lista,valore,&ptr_lista);
             if(b=TRUE)
                printf("Elemento presente nella lista\n\n");
            else
                printf("Elemento non trovato\n\n");
    
            break;
    
         case 6:
    
            system("CLS");
    
            printf("STAMPA LISTA\n");
            stampa(ptr_lista);
    
    
    
            break;
    
    
         case 7:
    
            system("CLS");
    
            printf("SOMMA DEGLI ELEMENTI DELLA LISTA\n");
            y=somma(ptr_lista);
            printf("Questa è la somma di tutti gli elementi della lista:  %d",y);
    
    
    
            break;
    
        case 8:
    
            system("CLS");
    
            printf("LUNGHEZZA DELLA LISTA\n");
            x=lunghezza(ptr_lista);
            printf("Questa è la somma di tutti gli elementi della lista:  %d",x);
    
    
    
            break;
    
         case 0:
    
            return 0;
    
    
            }
    
    
        }
    
    
    
    
    
    return 0;   //è legato al valore di ritorno del main!
    }
    
    
    int menu (void){
    
    int x;
    
    printf("\n\nSELEZIONA LA TUA SCELTA\n\n");
    printf("1.Per inserire in testa\n");
    printf("2.Per cancellare in testa\n");
    printf("3.Per inserire in coda\n");
    printf("4.Per inserire in ordine\n");
    printf("5.Per cercare un elemento\n");
    printf("6.Per stampare la lista\n");
    printf("7.Per conoscere la somma degli elementi della lista\n");
    printf("8.Per conoscere la lunghezza della lista\n");
    printf("0.Per uscire\n");
    printf("\n\n\n");
    printf("Digita ora la tua scelta:   ");
    scanf("%d",&x);
    
    while(x<0||x>8){
        printf("Selezione errata\n");
        printf("Digita il numero corretto\n");
        scanf("%d",&x);
    
    
    
    }
    
    return x;
    
    }
    
    
    void init(struct list **ptrptr){
    
    *ptrptr=NULL;          
    
    
    }
    
    void ins_testa(struct list **ptrptr,int valore){
    
        struct list *tmp;
    
        tmp=*ptrptr;
        *ptrptr=(struct list *)malloc(sizeof(struct list));
        (*ptrptr)->valore=valore;
        (*ptrptr)->next=tmp; 
    
    
    }
    
    bool can_testa(struct list **ptrptr){
    
    
        struct list *tmp;
        int *val_ptr;
    
        if(*ptrptr!=NULL){
    
            *val_ptr=(*ptrptr)->valore;
            tmp=*ptrptr;
            ptrptr=&(*ptrptr)->next;
            free(tmp);
            return TRUE;
    
    
        }
    else
    
        return FALSE;
    
    }
    
    void ins_coda(struct list **ptrptr,int valore){
    
    
    while(*ptrptr!=NULL)
    
        ptrptr=&((*ptrptr)->next);
    
    
        ins_testa(ptrptr,valore); //SPIEGARE X BENE PERCHE' SI PASSA PTRPTR
    
    
    }
    void ord_ins(struct list **ptrptr,int valore){
    
        while(*ptrptr!=NULL&&(*ptrptr)->valore<valore)
            ptrptr=&((*ptrptr)->next);
    
        ins_testa(ptrptr,valore);
    
    
    
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    bool cerca (struct list *ptr,int valore,struct list **ptrptr){
    
        bool found;
    
        found=FALSE;
    
        while(ptr!=NULL && found==FALSE){
    
            if(ptr->valore==valore){
    
                found=TRUE;
                *ptrptr=ptr;
    
            }
            else
    
                ptr=ptr->next;
        }
    
    
    
    return found;
    
    }
    
    
    
    
    void stampa (struct list *ptr){
    
    
        printf("punt_lista---->");
        while(ptr!=NULL){
            printf("%d",ptr->valore);
            printf("---->");
            ptr=ptr->next;
            }
    
            printf("NULL\n");
    
    
    
    
    }
    
    int somma (struct list *ptr){
    
    
    int sum=0;
    
    while(ptr!=NULL){
    
        sum+=ptr->valore;
        ptr=ptr->next;
    
    
    
    }
    return sum;
    
    
    
    
    }
    
    int lunghezza(struct list *ptr){
    
     int l=0;
     while(ptr!=NULL){
        l++;
        ptr=ptr->next;
    
    
     }
    
    return l;
    Questa è una versione funzionante, inserito inoltre altre due funzioni, una per conoscere la somma degli elementi inseriti ed una per conoscere la lunghezza della lista.
    Ho bisogno ancora di lavorare sulla funzione che cancella un elemento in testa, appenatroverò una sol, posterò anche questo.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Ciao a tutti, premesso che circa un paio di settimana addietro, avevo postato la richiesta di aiuto per risolvere l'implementazione di liste con doppio puntatore. Purtroppo nn ho avuto modo di risp prima per problemi alla connessione, uso un adsl ad onde radio, con parabola, ed aimè ultimamente stò avuto numerosi inghippi, causa maltempo.

    Cmq voglio ringraziare Marco1995 che mi aveva suggerito la soluzione al problema, quindi GRAZIE.
    Prego,figurati

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.