Прокомментировать код заполнения списка - C (СИ)
Формулировка задачи:
Помогите, пожалуйста, разобраться со списками. Завал с ними был ещё в мае, после лета в голове вообще одна каша, и никаких умных мыслей. вот пример простой задачи, прошу, чтобы описали, что именно творится в каждой строчке. ну или хотя бы в заполнении списка
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct st
{ char ch;
struct st *next;
} stack;
main()
{ stack *p,*q;
char a;
p=NULL;
system (“CLS”);
// заполнение стека
do
{ a=getchar();
q=(stack *)malloc(sizeof(stack));
q->next=p;
p=q;
q->ch=a;
} while(a!='.');
// печать стека c освобождением памяти
do
{ p=q->next;
free(q);
q=p;
printf("%c",p->ch);
} while(p->next!=NULL);
getch();
return 0;
}Решение задачи: «Прокомментировать код заполнения списка»
textual
Листинг программы
typedef struct st { // одна ячейка списка
char ch; // хранит один байт
struct st *next; // и ссылку на предыдущую ячейку
} stack;
stack *q, *p;
char a;
p=NULL;
// заполнение стека
do
{
q=(stack *)malloc(sizeof(stack)); // выделяется память под ячейку
q->ch= getchar(); // ячейка заполняется символом из stdin
q->next=p; // и ссылкой на предыдущую ячейку (для первой ячейки - NULL)
p=q;
} while(q->ch!='.'); // полледним в стек заносится символ '.'
Объяснение кода листинга программы
- В первой строке объявляется структура данных
stдля представления одной ячейки в списке. Она содержит один символ и указатель на следующую ячейку. - Затем объявляются две переменные типа
stack-pиq, а также переменнаяaтипаchar. Переменнаяpинициализируется значением NULL. - В цикле
do-whileвыделяется память под новую ячейкуq, заполняется её полеchсимволом, считываемым из стандартного ввода, и создается ссылка на предыдущую ячейкуp. Значениеpобновляется, указывая на новую ячейкуq. Цикл продолжается, пока не будет считан символ '.' - После окончания цикла, последняя ячейка списка указывает на саму себя, так как
pне обновляется, когда считывается символ '.'