Первое, что неправильно, это:
structure *ptr = malloc(sizeof(ptr));
, который выделяет достаточно места для хранения ptr
, который является указателем, вам нужно
structure *ptr = malloc(sizeof(*ptr));
Распределив всеправильно, доступ к вещам в первом элементе, как это:
ptr->data; // the data
ptr->next; // pointer to the next struct in the chain
Доступ к вещам во втором struct
, как это
ptr->next->data; // data in the second struct
ptr->next->next; // pointer to the third struct
и т. д.
ИмеяПросто прочитайте некоторые комментарии к этому вопросу, я должен добавить, что ptr->next->next
опасен по своей природе, если вы не знаете, что и ptr
, и ptr->next
не равны нулю.Кроме того, malloc
не гарантирует обнуление памяти, поэтому после вызова malloc
вы всегда должны убедиться, что указатель next
равен NULL
.
Если у вас длинная цепочка, а последний элементчто означает наличие NULL
next
, вы можете перебирать цепочку с помощью цикла for
, например,
for (structure* current = ptr ; current != NULL ; current = current->next)
{
printf("%d\n", current->data);
}
или, если вы хотите найти n
th элемент
structure* ptrAtIndex(structure* start, int index)
{
for (structure* current = ptr, int i = 0 ; current != NULL ; current = current->next, i++)
{
if (i == index)
{
return current;
}
}
return NULL; // The chain wasn't long enough
}