Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. 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


"Che Dio abbia pietà dei miei nemici....perché io non ne avrò" Generale Patton
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