Domanda

Hey,
Sono un principiante in C e cercato di attuare la mia propria implementazione lista collegata, che sembra sostanzialmente in questo modo:

struct Element
{
    void *value;
    struct Element *next;
};

typedef struct
{
    struct Element *first;
    struct Element *last;
    unsigned int size;
} LinkedList;

void LinkedList_init(LinkedList *this)
{
    this->size = 0;
    this->first = NULL;
    this->last = NULL;
}

void LinkedList_add(LinkedList *this, void *value)
{
    struct Element *node = malloc(sizeof(struct Element));
    node->value = value;
    node->next = NULL;

    if (this->size == 0)
        this->first = this->last = node;
    else
    {
        this->last->next = node;
        this->last = node;
    }

    this->size++;
}

Così, in breve, voglio una lista collegata che può contenere tipi arbitrari - ho sentito, questo è possibile in C utilizzando puntatori void. Il problema ora si pone, quando voglio usare che l'attuazione, ad esempio con una struttura come il valore:

typedef struct
{
    int baz;
} Foo;

int main(void)
{
    LinkedList list;
    Foo bar;
    bar.baz = 10;

    LinkedList_init(&list);
    LinkedList_add(&list, (void *) &bar);

    /* try to get the element, that was just added ... */
    Foo *firstElement = (Foo *)list.first;
    /* ... and print its baz value */
    printf("%d\n", firstElement->baz);

    return 0;
}

L'ultima chiamata printf si limita a stampare valori come -1.077,927056 millions, che assomigliano a un indirizzo di memoria. Quindi è probabilmente un problema con i puntatori. Dopo la ricerca sul web negli ultimi giorni per un problema simile sul web (ho avuto fortuna in questo), ho cercato di buttare la mia logica di distanza e testato vari * e combinazioni casuali. Risulta, che era un vicolo cieco, troppo. : (

E 'probabilmente qualcosa di semplice per un programmatore più esperto C, ma non riesco proprio a trovare la risposta. Si prega di aiuto: D

È stato utile?

Soluzione

list.fist è un struct Element.

Prova:

Foo *firstElement = (Foo *)(list.first->value);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top