Другие языки программирования и технологии

Объясните, что делает программа на Си.

#include <stdio.h> #include <stdlib.h> typedef struct list_s { int data; struct list_s *next; } list, *plist; int main() { plist head, p, p1; int a; scanf("%d", &a); head = p = (plist)malloc(sizeof(list)); p->data = a; p->next = NULL; while(1) { scanf("%d", &a); if(a < 0) break; p = (plist)malloc(sizeof(list)); p->data = a; p->next = NULL; p1 = head; while(1) { if(p1->data >= a) { p->next = p1; head = p; break; } else { if(p1->next) { if(p1->next->data >= a) { p->next = p1->next; p1->next = p; break; } p1 = p1->next; } else { p1->next = p; break; } } } } p1 = head; while(p1) { printf("%d ", p1->data); p1 = p1->next; } return 0; } Прошу прокомментировать. Программа по моему понятию сортирует список в динамической памяти. Прошу или объяснить подробно алгоритм или прокомментировать код.
Это линейный односвязный список, состоящий из элементов типа структура, который содержит отсортированные по возрастанию целые положительные числа. Первый цикл выделяет память под новый элемент и заносит его в список, а во втором цикле производится сортировка данных. Выход из внешнего цикла предусмотрен вводом целого отрицательного числа. После чего данные выводятся на экран, также в цикле, начиная с первого и переходя к следующему элементу.
Предоставленный код нерабочий. Для динамического выделения памяти следует подключать заголовочный файл <stdlib.h>.
По выходу из программы следует удалить динамические данные, используя функцию free().

Предоставляю рабочий код программы:

// Visual C++ 2010
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>

typedef struct list_s
{
int data;
struct list_s *next;
}
list, *plist;

void main()
{
plist head, p, p1;
int a;

printf("\n Input a1: ");
scanf("%d", &a);

head = p = (plist)malloc(sizeof(list));
p->data = a;
p->next = NULL;

while(1)
{
printf("\n Input a2: ");
scanf("%d", &a);

if(a < 0) break;

p = (plist)malloc(sizeof(list));
p->data = a;
p->next = NULL;

p1 = head;

while(1)
{
if(p1->data >= a)
{
p->next = p1;
head = p;
break;
}
else
{
if(p1->next)
{
if(p1->next->data >= a)
{
p->next = p1->next;
p1->next = p;
break;
}
p1 = p1->next;
}
else
{
p1->next = p;
break;
}
}
}
}

p1 = head;

while(p1)
{
printf("\n %d ", p1->data);
p1 = p1->next;
}

free(p);
free(head);

_getch();
}
ОЧ
Отабек Чориев
65 023
Лучший ответ
Текст без форматирования невозможно читать
Александр Головин Текст был отформатирован, тут же всё сбросилось.
В main, в начале, добавляется первый элемент, а потом, в цикле, по одному добавляются элементы.
Чтобы закончить добавление, нужно ввести отрицательное число.
Список не сортируется, так как элементы сразу добавляются в нужную позицию (несколько условий во вложенном цикле) .
В самом конце список выводится на экран.