Oppure

Loading
17/09/11 9:16
flavio89
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.

#include <stdio.h>
#include <stdlib.h>

typedef struct elem {
    struct elem* next;
    void* key;
} elem;

elem* ins (elem*,void*,void*(*copia)(void*));
void* copia (void*);
elem* crea ();
void stampa (elem*);

main (){
    void* n;
    elem* head;
    //head = crea();

    while (1) {
        printf ("Numero : ");
        int insert;
        scanf ("%d",&insert);
        n = &insert;
        *(int*) n = insert;

        ins (head,n,copia);
        stampa (head);
        system ("pause");
        }


puts("");
system ("pause");
}

elem* ins (elem* head,void* k,void*(*copia)(void*)) {
    elem* temp;
    temp = malloc(sizeof(elem));
    temp->next = head;
    temp->key = copia (k);
    return temp;
    }

void* copia (void* a) {
    int* temp;
    if ((temp = malloc(sizeof(int))) == NULL) return NULL;
    *temp = *(int*) a;
    return (void*) temp;
    }

elem* crea () {
    elem* temp;
    temp = NULL;
    return temp;
    }

void stampa (elem* head) {
    elem* cur;
    cur = head;

    while (cur != NULL) {
    int t = cur->key;
    printf ("%d\n",t);
    cur = cur->next;
    }
}


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
aaa
17/09/11 10:13
HeDo

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

printf ("Numero : ");
        int insert;
        scanf ("%d",&insert);


la dichiarazione del main è sbagliata:

main ()


deve essere

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

ins(head, n, copia);


che dovrebbe essere
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.
aaa
17/09/11 10:34
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.

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.
aaa
17/09/11 13:20
HeDo
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.

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?
aaa
17/09/11 15:28
flavio89
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?


void stampa (elem* head) {
    elem* cur;
    cur = head;

    while (cur != NULL) {
    int t = cur->key;
    printf ("%d\n",t);
    cur = cur->next;
    }
aaa
17/09/11 15:43
HeDo
no è sbagliato, key è un puntatore ad un tipo qualsiasi, ma pur sempre un puntatore.

risolvi così:


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

aaa
17/09/11 16:03
flavio89
Ti ringrazio! ora funziona! perfetto!
La condizione di fine while è però cur->next != NULL, non cur != NULL.

Ribadisco, grazie mille.
aaa
17/09/11 16:04
HeDo
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 :)
aaa