C - Связанный список и проблема с указателем - PullRequest
0 голосов
/ 27 ноября 2010

Привет,
Я новичок в 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 с помощью пустых указателей.Теперь возникает проблема, когда я хочу использовать эту реализацию, например, со структурой в качестве значения:

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, которые выглядят как адрес памяти.Так что это, вероятно, проблема с указателями.После поиска в сети последних нескольких дней аналогичной проблемы в Интернете (мне не повезло с этим), я попытался отбросить свою собственную логику и протестировать различные случайные * и комбинации.Оказывается, это тоже тупик.: (

Возможно, для более опытного программиста на Си это что-то простое, но я просто не могу найти ответ. Пожалуйста, помогите: D

1 Ответ

7 голосов
/ 27 ноября 2010

list.fist является struct Element.

Попытка:

Foo *firstElement = (Foo *)(list.first->value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...