0

ねえ、
私はCの初心者で、基本的に次のような独自のリンクリスト実装を実装しようとしました。

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++;
}

つまり、任意の型を保持できるリンクリストが必要です。これはCでvoidポインタを使用することで可能になると聞きました。たとえば、値として構造体を使用してその実装を使用する場合、問題が発生します。

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

最後のprintf呼び出しは、メモリアドレスのように見える-1077927056のような値を出力するだけです。したがって、おそらくポインタの問題です。過去数日間、Webで同様の問題を検索した後(運が悪か​​った)、自分のロジックを捨てて、さまざまなランダムな*&の組み合わせをテストしました。結局、それも行き止まりでした。:(

経験豊富なCプログラマーにとってはおそらく簡単なことですが、答えが見つかりません。助けてください:D

4

1 に答える 1

7

list.fistですstruct Element

試す:

Foo *firstElement = (Foo *)(list.first->value);
于 2010-11-26T23:30:16.130 に答える