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++ - Problema stampa e/o inserimento in una lista generica
Forum - C/C++ - Problema stampa e/o inserimento in una lista generica

Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 11:16
Sabato, 17/09/2011
Salve ragazzi. Ho scritto un codice per l'inserimento in testa in una lista generica.
Non è tutta farina del mio sacco, visto che buona parte del codice l'ho trovata in rete.
All' esecuzione (non ho nè error nè warning), inserisco il dato, ma subito dopo, quando richiamo la stampa, mi viene mostrato un solo elemento alla volta (quindi deduco che sovrascriva) e oltretutto è sempre -1;
Non capisco quindi se l'errore è da ricercarsi nella stampa o nell' inserimento stesso.

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct elem {
  5.     struct elem* next;
  6.     void* key;
  7. } elem;
  8.  
  9. elem* ins (elem*,void*,void*(*copia)(void*));
  10. void* copia (void*);
  11. elem* crea ();
  12. void stampa (elem*);
  13.  
  14. main (){
  15.     void* n;
  16.     elem* head;
  17.     //head = crea();
  18.  
  19.     while (1) {
  20.         printf ("Numero : ");
  21.         int insert;
  22.         scanf ("%d",&insert);
  23.         n = &insert;
  24.         *(int*) n = insert;
  25.  
  26.         ins (head,n,copia);
  27.         stampa (head);
  28.         system ("pause");
  29.         }
  30.  
  31.  
  32. puts("");
  33. system ("pause");
  34. }
  35.  
  36. elem* ins (elem* head,void* k,void*(*copia)(void*)) {
  37.     elem* temp;
  38.     temp = malloc(sizeof(elem));
  39.     temp->next = head;
  40.     temp->key = copia (k);
  41.     return temp;
  42.     }
  43.  
  44. void* copia (void* a) {
  45.     int* temp;
  46.     if ((temp = malloc(sizeof(int))) == NULL) return NULL;
  47.     *temp = *(int*) a;
  48.     return (void*) temp;
  49.     }
  50.  
  51. elem* crea () {
  52.     elem* temp;
  53.     temp = NULL;
  54.     return temp;
  55.     }
  56.  
  57. void stampa (elem* head) {
  58.     elem* cur;
  59.     cur = head;
  60.  
  61.     while (cur != NULL) {
  62.     int t = cur->key;
  63.     printf ("%d\n",t);
  64.     cur = cur->next;
  65.     }
  66. }



A voi che siete sicuramente più esperti di me, chiedo di spiegarmi quale possa essere il problema, se appunto sia la stampa o l'inserimento.
Grazie anticipatamente

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 12:13
Sabato, 17/09/2011

allora, questo codice non può essere C a causa di questa dichiarazione dentro il codice del main:

Codice sorgente - presumibilmente C/C++

  1. printf ("Numero : ");
  2.         int insert;
  3.         scanf ("%d",&insert);



la dichiarazione del main è sbagliata:

Codice sorgente - presumibilmente Plain Text

  1. main ()



deve essere

Codice sorgente - presumibilmente C/C++

  1. int main()



oltre al fatto che il codice, come hai detto tu, è palesemente copiato, per due semplici motivi.

1) Questa è una lista generica, ovvero può contenere dati di qualsiasi genere (volendo anche non omogenei)
2) Utilizza una funzione di callback per effettuare la copia, il che evidenza un livello abbastanza alto del programmatore che l'hai scritta

Il problema sta sicuramente nella riga

Codice sorgente - presumibilmente Plain Text

  1. ins(head, n, copia);



che dovrebbe essere
Codice sorgente - presumibilmente Plain Text

  1. head = ins(head, n, copia);



perchè se tu avessi letto il codice di cui hai fatto copia-incolla avresti visto che la funzione ins restituisce la testa aggiornata.

questa volta ti ho aiutato, ma sappi che non tollero codice copiato e incollato, che sia l'ultima volta.

PM Quote
Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 12:34
Sabato, 17/09/2011
Il problema è che la programmazione adesso si insegna così:
Eccovi l' algoritmo. Arrivederci.

Senza alcun tipo di spiegazione.
Ecco che allora lo studente si trova a dover andare "a tentativi" per capire cosa diavolo faccia quell' algoritmo.

E comunque, per la cronaca, parte del codice è copiato, il resto, come la stampa e i vari casting nel main per inserire un dato, sono opera mia.

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 15:20
Sabato, 17/09/2011
Testo quotato

Postato originariamente da flavio89:

Il problema è che la programmazione adesso si insegna così:
Eccovi l' algoritmo. Arrivederci.

Senza alcun tipo di spiegazione.
Ecco che allora lo studente si trova a dover andare "a tentativi" per capire cosa diavolo faccia quell' algoritmo.




purtroppo ti capisco, do ripetizioni di informatica a studenti universitari e mi dicono tutti la stessa cosa.

è un po come la matematica, ci vogliono professori che sappiano spiegarla.

Testo quotato


E comunque, per la cronaca, parte del codice è copiato, il resto, come la stampa e i vari casting nel main per inserire un dato, sono opera mia.



ma con i miei consigli funziona?

PM Quote
Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 17:28
Sabato, 17/09/2011
no continua a non funzionare ma adesso stampa il numero di elementi effettivi nella lista solo che stampa memoria, può essere un problema di stampa?
prima di stampare, è giusto il casting int?


Codice sorgente - presumibilmente C/C++

  1. void stampa (elem* head) {
  2.     elem* cur;
  3.     cur = head;
  4.  
  5.     while (cur != NULL) {
  6.     int t = cur->key;
  7.     printf ("%d\n",t);
  8.     cur = cur->next;
  9.     }


PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 17:43
Sabato, 17/09/2011
no è sbagliato, key è un puntatore ad un tipo qualsiasi, ma pur sempre un puntatore.

risolvi così:

Codice sorgente - presumibilmente C/C++

  1. int val = *(int *)cur->key;


PM Quote
Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 18:03
Sabato, 17/09/2011
Ti ringrazio! ora funziona! perfetto!
La condizione di fine while è però cur->next != NULL, non cur != NULL.

Ribadisco, grazie mille.

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 18:04
Sabato, 17/09/2011
Testo quotato

Postato originariamente da flavio89:

Ti ringrazio! ora funziona! perfetto!
La condizione di fine while è però cur->next != NULL, non cur != NULL.

Ribadisco, grazie mille.



di nulla, siamo qui per aiutare :)

PM Quote