Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - funzione di stampa, liste
Forum - C/C++ - funzione di stampa, liste

Avatar
AcId-SiMo88 (Normal User)
Newbie


Messaggi: 5
Iscritto: 04/08/2006

Segnala al moderatore
Postato alle 20:32
Venerdì, 01/02/2008
Ciao a tutti, ho un problema che mi sta un po logorando con una semplice stampa di una lista!
Non riesco proprio a risolverlo nonstante l'aiuto di altri 2 ragazzi con un po + esperienza di me :d
invece che stampare ciò che vorrei, si vedono caratteri incomprensibili come se il puntatore fosse sbagliato, inoltre ho un segmentation fault, ma non riesco tuttavia a risolvere, ecco il codice:

listone.c
Codice sorgente - presumibilmente C++

  1. #include "listone.h"
  2. /*Aggiunta di un nuovo elemento alla lista*/
  3. /*===================================================*/
  4. void nuovo_elemento(LISTA *pLista)
  5. {
  6.         int i;
  7.         char NomE[LUNGH_MAX_NOME];
  8.         char CognomE[LUNGH_MAX_NOME];
  9.         int EtA;
  10.         LISTA *puntante;
  11.         LISTA *prec=NULL;
  12.         LISTA *corr=pLista;
  13.         puntante=(LISTA *)malloc(sizeof(LISTA));
  14.        
  15.         if(puntante==NULL)
  16.         {
  17.                 printf("C'è un problema con la memoria\n");
  18.                 exit (-1);
  19.         }
  20.         printf("Inserire nome\n");
  21.         fflush(stdin);
  22.         scanf("%s", &NomE);
  23.         printf("Inserire cognome\n");
  24.         scanf("%s", &CognomE);
  25.         printf("Inserire età\n");
  26.         scanf("%d", &EtA);
  27. /*===== Controlli sull'inserimento di campi corretti =====*/
  28. for(i=0; NomE[i]=='\0';i++)
  29.         if((NomE[i]>'a' && NomE[i]<'z')||(NomE[i]>'A' && NomE[i]<'Z'));
  30.                 strcpy(puntante->nome,NomE);
  31. for(i=0; CognomE[i]=='\0';i++)
  32.         if((CognomE[i]>'a' && CognomE[i]<'z')||(CognomE[i]>'A' && CognomE[i]<'Z'));
  33.                 strcpy(puntante->cognome,CognomE);
  34.                
  35. if (EtA>0 && EtA<130)
  36. puntante->eta=EtA;
  37. /*=====  =====*/
  38.                 puntante->id++;
  39.         puntante->succ=NULL;
  40.        
  41.         while((corr!=NULL)&&(puntante->id>corr->id))
  42.         {
  43.                 prec=corr;
  44.                 corr=corr->succ;
  45.         }
  46.         if(prec==NULL)
  47.         {
  48.                 puntante->succ=pLista;                          pLista=puntante;                       
  49.         }
  50.         else
  51.         {
  52.                 prec->succ=puntante;
  53.                 puntante->succ=corr;
  54.         }
  55.        
  56. }
  57. /*========================================================*/
  58.  
  59. void stampaLista(LISTA *pLista)
  60. {
  61.         printf("\n");
  62.         prov=pLista;
  63.         while (pLista->succ!=NULL)
  64.         {
  65.                 printf("\nNome: %s \t\tCognome:%s \t\tEta: %d \n", pLista->nome, pLista->cognome,pLista->eta);
  66.                 pLista = pLista->succ;
  67.         }
  68.         printf("\n");
  69. }
  70. /*============================================================*/
  71. void pause(){
  72.         printf("Premere INVIO per continuare\n");
  73.         getchar();
  74. }



listone.h
Codice sorgente - presumibilmente C++

  1. #ifndef libc
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6.  
  7. #define LUNGH_MAX_NOME 100
  8. #define DIM_LISTA 50
  9.  
  10. typedef struct lst
  11. {
  12.         char nome[LUNGH_MAX_NOME];
  13.         char cognome[LUNGH_MAX_NOME];
  14.         int eta;
  15.         int id;
  16.         struct lst *succ;
  17. } LISTA;
  18.  
  19. void inizializzaLISTA();
  20. void nuovo_elemento(LISTA *);
  21. void stampa_listone();
  22. void stampaLista(LISTA *);
  23. void pause();
  24. #endif



main.c
Codice sorgente - presumibilmente C++

  1. /*Programma di sintesi sull'utilizzo di liste ordinate*/
  2. #include <stdio.h>
  3. #include "listone.h"
  4.  
  5. int main()
  6. {
  7.         int scelta;
  8.         LISTA array;
  9.         LISTA *pLista;
  10.         pLista=&array;
  11.         do
  12.         {
  13.                 printf("Benvenuto, premi uno dei seguenti tasti:\n");
  14.                 printf("[0] Esci senza salvare\n");
  15.                 printf("[1] Inserisci un nuovo elemento nella lista\n");
  16.                 printf("[2] Modifica un elemento della lista\n");
  17.                 printf("[3] Elimina un elemento della lista\n");
  18.                 printf("[4] Salva il contenuto della lista\n");
  19.                 printf("[5] Carica una lista preesistente\n");
  20.                 printf("[6] Stampa la lista\n");
  21.                 scanf("%d", &scelta);
  22.                 printf("\nHai scelto %d\n", scelta);
  23.                 switch(scelta)
  24.                 {
  25.                         case 0: printf("Ciao, a presto\n");
  26.                                         return 0;
  27.                         case 1:
  28.                                 {
  29.                                         nuovo_elemento(pLista);
  30.                                 }
  31.                                         break;
  32.                         case 6:
  33.                                 {
  34.                                         stampaLista(pLista);
  35.                                         pause();
  36.                                         break;
  37.                                 }
  38.                         default:
  39.                                 {
  40.                                         printf("Scelta non consentita, riprova\n");
  41.                                         break;
  42.                                 }
  43.                 }
  44.         }
  45.                 while(scelta);
  46.         return 0;
  47. }



scusate la prolissità, mi servirebbe conoscere il porblema entro domenica sera....lunedì ho l'esame su queste cose e un chiarimento mi farebbe molto bene...grazie in anticipo in ogni caso

PM Quote
Avatar
bangirasu (Normal User)
Rookie


Messaggi: 39
Iscritto: 15/08/2007

Segnala al moderatore
Postato alle 2:20
Sabato, 02/02/2008
Secondo me, e data la tarda ora non sono totalmente sicuro, l'errore è qui:
pLista=puntante;
nella funzione nuovo_elemento
xke da quello ke vedo pLista è un puntatore ad un elemento della lista e nn è l'indirizzo in cui risiede il puntatore alla lista...
Cioè tu con il typedef hai chiamato un elemento ( detto anche nodo della lista) LISTA, xò quello nn è una lista ma è solo un elemento...
quindi tu hai chiamato un elemento con il nome LISTA, quindi la lista avrà il tipo LISTA* quindi in questa funzione
void nuovo_elemento(LISTA *pLista)
tu stai passando pLista che è un puntatore a LISTA (che è un elemento), cioè pLista è un puntatore ad un singolo elemento (che hai kiamato LISTA), cioè pLista, essendo un puntatore ad un elemento ad un elemento, è una lista. invece quello ke devi fare è passare alla funzione un puntatore a lista, cioè un puntatore ad un puntatore a elemento... Passando pLista come hai fatto tu quando esegui
pLista=puntante;
pLista viene modificato solo nell'ambiente della funzione.

Un'alra cosa:
puntante->id++;
questo id non viene mai inizializzato e la malloc non imposta le variabili ne a 0 ne a NULL quindi stai incrementando un numero a caso...

Anche nella funzione di stampa fai un'assegnazione a pLista
pLista = pLista->succ;
questa assegnazione modifica pLista SOLO nell'ambiente della funzione; e in questo caso è giusto farlo poichè la stampa non deve modificare la lista.

PS: mi sembra ke l'errore sia quello e sottolineo il "mi sembra"

PM Quote