Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    3

    Problema Gestione anagrafica con liste con Dev C

    Salve, sono nuovo del forum e mi scuso in anticipo per la fretta di avere notizie riguardo a quello che chiederò.
    Il problema riguarda la creazione di una gestione anagrafica con liste. Ho già scritto il codice ma il problema riscontrato è dovuto ad un errore di runtime dopo aver correttamente compilato. Non riscontro errori di sintassi ma continuo ad avere difficoltà nella comprensione dell'errore generato.
    Di seguito riporto quanto redatto:


    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    
    #define OUT 100
    
    
    struct elemento{
           int codfisc;
           struct elemento *pun;
           };
           
    struct elemento *creaLista();
    void visLista(struct elemento *);
    struct elemento *paus=0;
    int i=0;
    main()
    {
          int scelta;
         char invio;
         struct elemento *punLista;
         while(scelta!=OUT){
             system("cls");
             printf("\n\n\t\t  ANAGRAFE");
             printf("\n\n  1. Immissione persona");
             printf("\n\n  2. Cancellazione persona");
             printf("\n\n  3. Ricerca persona");
             printf("\n\n  4. Visualizza anagrafe"); 
             printf("\n\n  0. Fine");   
             printf("\n\n\n  Scegliere una opzione\n");   
             scanf("%d", &scelta);
             scanf("%c", &invio);
             printf("\n\n\n");
             switch(scelta) {
                 case 0:
                      scelta=OUT;
                      break;
                 case 1:
                      i=i+1;
                      printf("%d",i);
                      punLista=creaLista();
                      break;
                 case 2:
                      //canPer();
                      break;
                 case 3:
                      //ricPer();
                      break;
                 case 4:
                      visLista(punLista);
                      break;
                      }
                      }
    
    
    }
    
    
    
    
    
    
    struct elemento *creaLista()
    {
           struct elemento *p,*paus;
          
     
           if(i==1){
                p=(struct elemento*)malloc(sizeof(struct elemento));
                printf("Inserisci il codice fiscale della 1a persona:\n");
                scanf("%d", &p->codfisc);
                paus=p;}
           if(i>1){
                paus->pun=(struct elemento *)malloc(sizeof(struct elemento));
                paus=paus->pun;
                printf("Inserisci il codice fiscale della %da persona::\n", i);
                scanf("%d", &paus->inf);} 
    return(p);              
    }
    
    
    
    
    void visLista(struct elemento *p)
    {
         char invio;
         printf("punLista --->");
         while(p!=NULL){
                        printf("%d\n", p->inf);
                        p=p->pun;
                        printf("premere un tasto per vedere l'elemento successivo");
                        scanf("%c", &invio);
                        }
         printf("NULL\n");
    }

    Sarà ormai la stanchezza ma non riesco a capacitarmene e non ho ormai molto tempo per far capo alle sole mie capacità.
    Grato in anticipo porgo cordiali saluti.
    Ultima modifica di LeleFT; 12-06-2014 a 13:06 Motivo: Aggiunti i tag CODE

  2. #2
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ciao,
    ho sistemato alcune cose, in particolare ho praticamente riscritto la funzione creaLista. Di fatto non facevi correttamente l'inserimento in coda di un nuovo elemento. Il modo corretto di farlo è questo:
    - scorri la lista fino alla fine, passando da un elemento al successivo
    - quando sei arrivato all'ultimo elemento, "attacchi" quello nuovo

    Io ho corretto il codice seguendo quello che avevi fatto, ma continua a non piacermi per un motivo molto semplice: preferirei che la parte di richiesta delle informazioni all'utente e quella di gestione della lista fossero separate. Significa che preferirei una funzione

    codice:
    struct elemento * ins_in_coda(struct elemento *lista, int nuovo_elemento)

    che si occupasse solo di inserire un elemento in coda alla lista, lasciando il dialogo con l'utente (printf e scanf) ad altre parti del codice.

    Comunque prova a dare un'occhiata a questo:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    
    
    
    #define OUT 100
    
    
    
    
    struct elemento
    {
        int codfisc;
        struct elemento *pun;
    };
    
    
    struct elemento *creaLista();
    void visLista(struct elemento *);
    struct elemento *paus=0;
    int i=0;
    
    
    int main()
    {
        int scelta;
        char invio;
        struct elemento *punLista = NULL;
        while(scelta!=OUT)
        {
            system("cls");
            printf("\n\n\t\t ANAGRAFE");
            printf("\n\n 1. Immissione persona");
            printf("\n\n 2. Cancellazione persona");
            printf("\n\n 3. Ricerca persona");
            printf("\n\n 4. Visualizza anagrafe");
            printf("\n\n 0. Fine");
            printf("\n\n\n Scegliere una opzione\n");
            scanf("%d", &scelta);
            scanf("%c", &invio);
            printf("\n\n\n");
            switch(scelta)
            {
            case 0:
                scelta=OUT;
                break;
            case 1:
                i=i+1;
                printf("%d",i);
                punLista=creaLista(punLista);
                break;
            case 2:
            //canPer();
                break;
            case 3:
            //ricPer();
                break;
            case 4:
                visLista(punLista);
                break;
            }
        }
    
    
        return 0;
    
    
    
    
    }
    
    
    
    
    struct elemento *creaLista(struct elemento *head)
    {
        struct elemento *p, *tmp;
    
    
        p = (struct elemento*) malloc(sizeof(struct elemento));
        p->pun = NULL;
    
    
        if(i == 1 && head == NULL)
        {
            printf("Inserisci il codice fiscale della 1a persona:\n");
            scanf("%d", &p->codfisc);
            head = p;
            return head;
        }
    
    
        printf("Inserisci il codice fiscale della %da persona:\n", i);
        scanf("%d", &p->codfisc);
    
    
        tmp = head;
        while(tmp->pun != NULL)
            tmp = tmp->pun;
        tmp->pun = p;
        return head;
    }
    
    
    
    
    void visLista(struct elemento *p)
    {
        char invio;
        printf("punLista --->");
        while(p!=NULL)
        {
            printf("%d\n", p->codfisc);
            p=p->pun;
            printf("premere un tasto per vedere l'elemento successivo");
            scanf("%c", &invio);
        }
        printf("NULL\n");
    }



  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    3
    Grazie mille! Sei stato veramente tempestivo. Adesso provo subito

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    3
    Dalla prova effettuata va tutto ok.
    Adesso mi sono spinto oltre per la gestione di un registro studenti. Ho fatto la funzione inserimento visualizzazione ma non riesco a capire perché non funziona la funzione cancella studente. Qualcuno potrebbe darmi una mano?
    Di seguito il listato fatto:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <string.h>
    
    
    
    
    
    
    
    
    #define OUT 100
    #define DIM 30
    
    
    
    
    
    
    
    
    struct studente
    {
        char cognome[DIM];
        char nome[DIM];
        int voto;
        struct studente *pun;
    };
    
    
    
    
    struct studente *creaLista(struct studente *);
    void visLista(struct studente *);
    struct studente *paus=0;
    void canPer(struct studente *);
    int i=0;
    
    
    
    
    int main()
    {
        int scelta;
        char invio;
        struct studente *punLista = NULL;
        while(scelta!=OUT)
        {
            system("cls");
            printf("\n\n\t\t MENU");
            printf("\n\n 1. Immissione persona");
            printf("\n\n 2. Cancellazione persona");
            printf("\n\n 3. Ricerca persona");
            printf("\n\n 4. Visualizza anagrafe");
            printf("\n\n 0. Fine");
            printf("\n\n\n Scegliere una opzione\n");
            scanf("%d", &scelta);
            scanf("%c", &invio);
            printf("\n\n\n");
            switch(scelta)
            {
            case 0:
                scelta=OUT;
                break;
            case 1:
                i=i+1;
                punLista=creaLista(punLista);
                break;
            case 2:
                 canPer(punLista);
                break;
            case 3:
            //ricPer();
                break;
            case 4:
                visLista(punLista);
                break;
            }
        }
    
    
    
    
        return 0;
    
    
    
    
    
    
    
    
    }
    
    
    
    
    
    
    
    
    struct studente *creaLista(struct studente *head)
    {
        struct studente *p, *tmp;
    
    
    
    
        p = (struct studente*) malloc(sizeof(struct studente));
        p->pun = NULL;
    
    
    
    
        if(i == 1 && head == NULL)
        {
            printf("Inserisci il nome della 1a persona:\n");
            scanf("%s", &p->nome);
            printf("Inserisci il cognome della 1a persona:\n");
            scanf("%s", &p->cognome);
            printf("Inserisci voto della 1a persona:\n");
            scanf("%d", &p->voto);
            head = p;
            return head;
        }
    
    
        printf("Inserisci il nome della %da persona:\n",i);
        scanf("%s", &p->nome);
        printf("Inserisci il cognome della %da persona:\n",i);
        scanf("%s", &p->cognome);
        printf("Inserisci voto della %da persona:\n",i);
        scanf("%d", &p->voto);
    
    
    
    
        tmp = head;
        while(tmp->pun != NULL)
            tmp = tmp->pun;
        tmp->pun = p;
        return head;
    }
    
    
    
    
    
    
    
    
    void visLista(struct studente *p)
    {
        char invio;
        printf("REGISTRO ANAGRAFE\n\n");
        while(p!=NULL)
        {
            printf("nome:%s\n", p->nome);          
            printf("cognome:%s\n", p->cognome);
            printf("voto:%d\n", p->voto);
            p=p->pun;
            printf("\n\npremere un tasto per vedere l'elemento successivo");
            scanf("%c", &invio);
        }
        printf("NULL\n");
    }
    
    
    void canPer(struct studente *head)
    {
         struct studente *canc, *canc1;
         canc=head;
         char nom1[DIM], cogn1[DIM];
         
         printf("CANCELLA STUDENTE\n\n");
         printf("Inserisci i dati dello studente da cancellare\n\n");
         printf("Inserisci nome\n");
         scanf("%s", &nom1);
         printf("inserisci cognome\n");
         scanf("%s", &cogn1);
         
         if(strcmp(canc -> nome, nom1)==0 && strcmp(canc -> cognome, cogn1)==0){
                    head = canc -> pun;
                    free(canc);}
         else {
                    canc = canc -> pun;
                    while(canc != NULL){
                            if(strcmp(canc -> nome, nom1)==0 && strcmp(canc -> cognome, cogn1)==0){
                            free(canc1 -> pun);
     
                            canc1 -> pun = canc1 -> pun -> pun;
                            }
                            canc = canc -> pun;
                            canc1 = canc1 -> pun;
                    }
            }
            
    }
    Ultima modifica di MItaly; 21-06-2014 a 18:50 Motivo: Aggiunti tag CODE

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Usa i tag CODE per il codice ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.