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++ - Problema liste generiche
Forum - C/C++ - Problema liste generiche

Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 17:39
Martedì, 13/09/2011
Ragazzi ho un problema con le liste generiche.
Premetto che il codice mi è stato dato dal mio docente di programmazione e che non ho scritto io il programma; proprio per questo non riesco a comprendere alcuni punti.
Per completezza ecco il codice, la traccia e la slide dalla quale ho copiato il sorgente.

sorgente http://dl.dropbox.com/u/25493505/sorgente.pdf
traccia http://dl.dropbox.com/u/25493505/traccia.pdf

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct{
  5. char nome [20];
  6. short eta;
  7. }INFO_FIELD;
  8.  
  9. void *creaLista();
  10. void insL_testa (short,INFO_FIELD *,void **);
  11. void insL_nodo (short,INFO_FIELD *,void **);
  12. void print (struct PERSONA*);
  13.  
  14.  
  15. void main ()  {
  16.     struct PERSONA {
  17.         INFO_FIELD info;
  18.         struct PERSONA *p_next;
  19.         };
  20.  
  21.     struct PERSONA* head;
  22.     //+p_next;
  23.  
  24.     int len_info = sizeof(INFO_FIELD);
  25.  
  26.     INFO_FIELD *p_nuovodato;
  27.     strcpy (p_nuovodato->nome,"pene");
  28.     p_nuovodato->eta = 5;
  29.  
  30.  
  31.     head = (struct PERSONA *) creaLista();
  32.  
  33.     puts ("Inserisci dato in testa");
  34.     insL_testa (len_info,p_nuovodato,&head);
  35.  
  36.     print (&head);
  37.  
  38.     puts ("Inserisci dato dopo nodo corrente");
  39.     //insL_nodo (len_info,p_nuovodato,&punt);
  40.  
  41.     puts ("Elimina in testa");
  42.     eliL_testa (&head);
  43.  
  44.     puts ("Elimina nodo corrente");
  45.     //eliL_nodo (&prec);
  46.     //prec è nodo precedente a quello da eliminare
  47.  
  48. puts("");
  49. system ("pause");
  50. }
  51.  
  52.  
  53. void *creaLista()
  54. {char *testa;
  55. testa=NULL;
  56. return testa;
  57. }
  58.  
  59. void insL_testa (short len_info,INFO_FIELD *p_dato, void **p_head)
  60. {struct lista
  61.     {INFO_FIELD info;
  62.     struct lista *p_next;
  63.     } *ptr;
  64.     ptr=calloc (1,sizeof (struct lista));
  65.     memcpy (ptr,p_dato,len_info);
  66.     ptr->p_next=(struct lista *)*p_head;
  67.     *p_head = ptr;
  68.     }
  69.  
  70. void insL_nodo(short len_info,INFO_FIELD *p_dato,void** p_punt){
  71.  
  72. struct lista {
  73. INFO_FIELD info;
  74. struct lista *p_next;
  75. } *ptr;     //condivide solo INFOFIELD con il main
  76.  
  77. ptr = calloc (1,sizeof(struct lista));
  78. memcpy (ptr,p_dato,len_info);
  79.     /* copia len info byte da
  80.      * p dato a ptr senza tener conto
  81.      * della struttura delle informazioni */
  82. ptr->p_next = ((struct lista*)*p_punt)->p_next;
  83. ((struct lista*)*p_punt)->p_next = ptr;
  84. *p_punt = ptr;
  85.  
  86. /* Il cast è obbligatorio prima di usare un puntatore
  87.  * generico, ma non quando lo si definisce */
  88. }
  89.  
  90.  
  91. void eliL_testa (void** p_head) {
  92.  
  93.     struct lista {
  94.     INFO_FIELD info;
  95.     struct lista *p_next;
  96.     }*ptr;
  97. ptr = ((struct lista*)*p_head)->p_next;
  98.  
  99. free ((struct lista*)*p_head);
  100. *p_head = ptr;
  101. }
  102.  
  103. void eliL_nodo (void ** p_punt) {
  104. struct lista {
  105.     INFO_FIELD info;
  106.     struct lista *p_next;
  107.     }*ptr;
  108.  
  109.     ptr = ((struct lista*)*p_punt) -> p_next;
  110.     ((struct lista*)*p_punt) -> p_next = ptr->p_next;
  111.     free (ptr);
  112. }
  113.  
  114. void print (struct PERSONA* head) {
  115.  
  116.     while (head->next != NULL) {
  117.         printf ("%s",head->nome);
  118.         printf ("  %d",head->eta);
  119.  
  120.         head = head->next;
  121. }
  122. }



Innanzitutto non capisco quale tipo deve assumere la variabile *p_nuovodato che sarebbe il dato da inserire nella lista.

Poi non capisco alcuni parametri passati alle funzioni.
Il paramentro &punt passato ad  ins_nodo;
il parametro &prec passato a eli_nodo;

Spero possiate aiutarmi o almeno darmi una dritta.
Grazie anticipatamente



C, con te litigo spesso, ma alla fin fine ti voglio bene
PM Quote