Объясните работу этой динамической структуры - C (СИ)
Формулировка задачи:
Объясните пожалуйста работу этой динамической структуры.
/* присвоить начальные значения NULL указателям first, item */
first=NULL;
item=NULL;
while (!feof(f))
{
tmp=(struct gaz*)malloc(sizeof(struct gaz));
if(first==NULL)
{/*переопределение указателей для первого элемента динамической структуры*/
first=tmp;
item=tmp;
}
else
{/*переход к следующему элементу*/
item->e=tmp;
item=tmp;
}
item->e=NULL;
fscanf(f,"%d%d%d%d",&(item->type),&(item->prop),&(item->emk),&(item->kol));
printf("type %3d proporcia 1 k %3d emkost %3d l kol-vo %5d\n",
item->type,item->prop,item->emk,item->kol);
}
fclose(f);Решение задачи: «Объясните работу этой динамической структуры»
textual
Листинг программы
first=NULL; // начальные значения NULL: first - начало списка, item - текущий узел
item=NULL;
while (!feof(f)) // чтение данных из файла, до конца файла
{
tmp=(struct gaz*)malloc(sizeof(struct gaz)); // память под новый узел списка
if(first==NULL) // если список пустой
{/*переопределение указателей для первого элемента динамической структуры*/
first=tmp; // то указатель на начало списка, и указатель на текущий элемент одинаковы
// и указывают на вновь созданный узел
item=tmp;
}
else // если список не пустой
{/*переход к следующему элементу*/
item->e=tmp; // указатель e предыдущего узла (указатель на следующий узел)
// устанавливается на новый узел
item=tmp; // указатель на текущий узел устанавливается на новый узел
}
item->e=NULL; // указатель e нового узла (указатель на следующий узел)
// уставливается на NULL (конец списка)
fscanf(f,"%d%d%d%d",&(item->type),&(item->prop),&(item->emk),&(item->kol)); // чтение данных из файла в поля нового узла
printf("type %3d proporcia 1 k %3d emkost %3d l kol-vo %5d\n",
item->type,item->prop,item->emk,item->kol); // вывод полей, данного узла на консоль
}
fclose(f); // все данные считаны, закрываем файл
Объяснение кода листинга программы
- Объявлены две переменные: first и item, которые будут использоваться для работы с динамической структурой. Первое значение этих переменных установлено в NULL.
- Запускается цикл while, который будет выполняться до тех пор, пока не будет достигнут конец файла (feof(f)).
- Внутри цикла создается новый узел tmp структуры gaz, с помощью функции malloc.
- Если список пустой (first == NULL), то первый элемент списка (first) и текущий элемент (item) указывают на только что созданный узел (tmp).
- Если список не пустой, то указатель e предыдущего узла (указатель на следующий узел) устанавливается на новый узел (tmp). Затем, указатель на текущий узел (item) также устанавливается на новый узел (tmp).
- Указатель e нового узла устанавливается на NULL, что означает конец списка.
- В поля нового узла (item) записываются данные, считанные из файла (функция fscanf).
- Поля нового узла (item) выводятся на консоль с помощью функции printf.
- После окончания цикла, файл закрывается с помощью функции fclose.