#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>
#define LMES 80
typedef struct inform { // структура данных
int index;
char message[LMES];
int count;
} INFORM;
typedef struct list_elem { // структура элемента списка
INFORM inform;
struct list_elem* next;
} LEL;
void MakeList(void); // прототипы функций
LEL* AddElem(LEL* last);
void PrintList(void);
int Alpha(char* message);
void To_Lower(char* message);
int MaxMin();
void Sort();
LEL* TakeFromList(int min);
void FreeList(void);
LEL* list; // указатель на начало списка
void main(void){
setlocale(LC_ALL, "rus");
system("chcp 1251");
MakeList(); // формирование списка
PrintList(); // печать списка
Sort();
PrintList();
FreeList(); // освобождение ДП
}
// Функция формирования списка-очереди
void MakeList(void)
{
int min;
puts("\n Входные данные (для завершения индекс - 0):\n");
LEL* list_end = NULL; // указатель на последний элемент списку
do { list_end = AddElem(list_end); } while (list_end != NULL);// цикл формирования списка
min = MaxMin();
}
// Функция добавления нового элемента в хвост списка
LEL* AddElem(LEL* last)
{
LEL* pel; // указатель на новый элемент
static int num = 1; // номер элемента, который вводиться
pel = (LEL*)malloc(sizeof(LEL)); // выделение ДП для элемента
// Вводимо индекс
printf("\n %d элемент: \nИндекс - ", num);
scanf_s("%d", &pel->inform.index);
rewind(stdin);
if (pel->inform.index == 0) { // конец введения
free(pel);
return NULL;
}
//Вводим предложения
printf("Предложение: ");
gets_s(pel->inform.message);
//Считаем кол-во разных букв
pel->inform.count = Alpha(pel->inform.message);
pel->next = NULL; // элемент будет последним в списке
if (list == NULL) // если это первый элемент
list = pel; // делаем его головой списка
else
last->next = pel; // иначе добавляем к последнему в списке
num++;
return pel;
}
//Функция нахождения разных букв
int Alpha(char* message) {
char* p1;
int count_digit;
char Lower[33] = { 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м',
'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ',
'ы', 'ь', 'э', 'ю', 'я' };
To_Lower(message);
count_digit = 0;
for (int i = 0; i < strlen(Lower); i++) {
p1 = strchr(message, Lower[i]);
if (p1) {
count_digit++;
}
}
return count_digit;
}
// Нахождение максимального и минимального числа
int MaxMin() {
int max = 0, min = 0;
LEL* pel = list;
while (pel != NULL) {
if (pel->inform.count > max)
max = pel->inform.count;
else
min = pel->inform.count;
pel = pel->next;
}
printf("\n ---------");
printf("\n| Max: %d |\n", max);
printf(" ---------");
printf("\n| Min: %d |\n", min);
printf(" ---------");
return min;
}
// Перевод строк в нижний регистр
void To_Lower(char* mes) {
char* p1;
int length, i;
p1 = mes;
length = strlen(p1);
for (i = 0; i < length; i++) {
p1[i] = tolower(p1[i]);
}
}
//Функция сортировки списка
void Sort() {
LEL* a, * b, * p, * h = NULL;
for (LEL* i = list; i != NULL; ) {
a = i;
i = i->next;
b = h;
for (p = NULL; (b != NULL) && (a->inform.count < b->inform.count); ) {
p = b;
b = b->next;
}
if (p == NULL) {
a->next = h;
h = a;
}
else {
a->next = b;
p->next = a;
}
}
if (h != NULL)
list = h;
};
// Функция вывода списка
void PrintList(void)
{
LEL* pel = list; int n = 0;
puts("\n\n\t Сформированный список:\n");
while (pel != NULL) {
printf(" %d)%7d\t%d\t%-.65s\n", ++n, pel->inform.index, pel->inform.count, pel->inform.message);
pel = pel->next;
}
}
// Функция стирания всего списка
void FreeList(void)
{
LEL* pel = list;
while (pel != NULL) {
list = list->next; // первым в списке стаёт следующий элемент
free(pel); // удаление поточного элемента
pel = list;
}
puts("\n\n Список стерт. \n");
}