Как обращаться к элементам списка структуры?
Есть такие 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 шт):
Сначала пишете конструкторы для каждой структуры.
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.
Удалением списка попробуйте заняться самостоятельно.