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 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


C, con te litigo spesso, ma alla fin fine ti voglio bene
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
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.


Ingegnere Informatico
https://ldlagency.it
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.


C, con te litigo spesso, ma alla fin fine ti voglio bene
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
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?


Ingegnere Informatico
https://ldlagency.it
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.     }



C, con te litigo spesso, ma alla fin fine ti voglio bene
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
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;



Ingegnere Informatico
https://ldlagency.it
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.


C, con te litigo spesso, ma alla fin fine ti voglio bene
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
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 :)


Ingegnere Informatico
https://ldlagency.it
PM Quote