@Retr0Hacker

Как внести все данные из текстового файла в односвязный список Си?

Задача: "Введенные мной предложения заносить в односвязный список. Найти предложение с максимальным количеством разных букв и сделать его первым в списке, а предложение с наименьшим кол-вом букв удалить".

Нужно создать два вариант программы: с вводом с клавиатуры и вводом из текстового файла.

И вот реализовать второй вариантом никак не получается. В односвязных списках еще новичок, и не в курсе всех тонкостей.

Код первого варианта программы (ввод с клавиатуры)
#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");
}
  • Вопрос задан
  • 478 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы