Как обращаться к элементам списка структуры?

Есть такие 2 структуры:

struct door {
    int id;
    int status;
};

struct node {
    struct door *door_Info;
    struct node *Next;
};

struct node* init(struct door* door) {
    struct node *NewNode;
    NewNode -> door_Info = door;
    NewNode -> Next = NULL;
    return(NewNode);
};

И в мейне следующее:

int main() {
    struct door doors[DOORS_COUNT];
    struct node *forDoor;
    forDoor = malloc(sizeof(struct node));
    for (int i = 0; i < 15; i++) {
        forDoor -> door_Info -> id = 1;
        forDoor = forDoor -> Next;
        }
    }
 }

Не знаю, как правильно обращаться к элементам структуры через список. forDoor -> door_Info -> id = 1; То есть как нужно записывать вот эту строку.


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

Автор решения: AlexGlebe

Сначала пишете конструкторы для каждой структуры.

void door_init ( struct door * const doo , int const id , int const st ) {
  doo -> id = id ;
  doo -> status = st ;
}

void node_init ( struct node * const no , struct door * const doo ) {
  no -> door_Info = doo ;
  no -> Next = ( void * ) 0 ;
}

Затем нужно выделить память для каждого объекта и вызвать для каждого из них конструкторы. Сначала создаём door его записываем в новый node. Получается один node уже создали правильно :

struct door * doo = malloc(sizeof(struct door));
door_init ( doo , 1 , 0 ) ;
struct node * no = malloc(sizeof(struct node));
node_init ( no , doo ) ;

Дальше задача будет создавать список. В цикле вы должны постоянно создавать элементы списка и их добавлять к уже существующему.
Создаём указатели на голову списка и на конец.
Если список пустой, то новый node записываем как голову и хвост.
Если список не пустой, то последнему node подправляем указатель на следующий элемент свежим и меняем указатель на последний элемент им же.

struct node * no_head = 0;
struct node * no_last = 0;
for (int i = 0; i < 15; i++ ) {
    struct door * doo = malloc(sizeof(struct door));
    door_init ( doo , 1 , 0 ) ;
    struct node * no = malloc(sizeof(struct node));
    node_init ( no , doo ) ;
    if ( ! no_last ) {
      no_head = no ;
      no_last = no ;
    } else {
      no_last -> Next = no ;
      no_last = no ;
    }
}

В результате получаете указатели на голову списка no_head и на хвост no_last.
Удалением списка попробуйте заняться самостоятельно.

→ Ссылка