Объяснить фрагмент кода с struct

<iostream>

using namespace std;

struct list_ele {
    int data;
    struct list_ele* pointer;
} ar[3];

int main() {
    struct list_ele* lp;

    ar[0].data = 5;
    ar[0].pointer = &ar[1];
    ar[1].data = 99;
    ar[1].pointer = &ar[2];
    ar[2].data = -7;
    ar[2].pointer = NULL;

    lp = ar;

    while (lp) {
        cout << "contents " << lp->data << endl;
        lp = lp->pointer;
    }
}

я вроде со структурой знаком но такую запись вижу в первые, например мне не понятно почему массив ar объявлен за скобками и как он работает, а ещё внутри структуры не понята эта строка struct list_ele* pointer; и потом так-же указываем struct list_ele* lp; В общем не очень понятный код, прошу объясните если не сложно. Спасибо!


Ответы (1 шт):

Автор решения: RottenRat
struct list_ele {
    int data;
    struct list_ele* pointer;
} ar[3];
int data - данные в списке
struct list_ele* pointer - указатель на следующий элемент списка
ar[3] - объявлении массива list_ele размерности 3 как глобальная переменная

Я так полагаю, здесь больше проблема в понимании работы списков или массивов, нежели в чем-либо еще

Это, как мне кажется, очень странно написанный код, но каждый элемент указывает на следующий в списке, то есть, обращаясь к list->next_element вы сможете обратиться к следующему элементу в списке

Пример:

//Допустим, объявили массив int[] a = new int[3]
a[2] = 1;

Эквивалентно:

for (int i = 0; i < 2; i++)
  a = a->pointer;
a->value = 1;

То есть за два шага цикла мы добрались до 3го элемента массива

Если вопрос состоит зачем здесь объявлен ar[3] - я не знаю. Вы и так сможете добраться до любого элемента списка и здесь объявление массива, как по мне, является ненужным костылем

→ Ссылка