Преобразовать файл, чтобы все строки имели длину, не превышающую длину наименьшей - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Помогите с алгоритмом задачи: Дан текстовый файл. Преобразовать его таким образом, чтобы все строки имели длину, не превышающую длину его наименьшей строки. Лишние символы при необходимости переносятся в строки, расположенные ниже. С такими структурами как списки, особенностью которых является то, что они помимо данных хранят еще и ссылку на след/пред элемент, особо не шарю. Вот функция чтения из файла:
#include <stdio.h>
#include <conio.h>
#include <string.h> 
#include <alloc.h>
#include <stdlib.h>
 
typedef struct list 
{
 char s;
 int i; 
 struct list *next; 
 
} LIST;
 
LIST *head=0; 
 
LIST *read_list(LIST *lst)
{
  LIST *p;
  FILE *file;
 
  file=fopen("ishodn.txt", "r");
 
if (file)
  {
    lst=(LIST *)malloc(sizeof(LIST));
    p=lst;
    while (1)
    {
    p->s=fgetc(file);
      if (!feof(file))
          {
           p->next=(LIST *)malloc(sizeof(LIST));
           p=p->next;
           } else
                break;
      }
    p->next=NULL;
 
      } else
    printf("file error \n");
 
  fclose(file);
 return lst;
}

Решение задачи: «Преобразовать файл, чтобы все строки имели длину, не превышающую длину наименьшей»

textual
Листинг программы
void OutListStr(long n, LIST list)
{
  long count = 0, waitflg = 0;
  LIST *ptr = &list;
  // 3десь открываешь файл, FILE *F;
  while (ptr != NULL)
  {
    if (count < n)
    {
      
      if (ptr->s == '\n')
      {
        
        fputc(ptr->s, F);
        count  = 0;
      }
      else
      {
        fputc(ptr->s, F);
        count++;
      }
      
    }
    else 
    {
      if (ptr->next!=NULL && ptr->next->s != '\n')
        fputc('\n', F);
      ptr = ptr->next;
    }
  }
}

Объяснение кода листинга программы

  1. Входные данные: n (количество строк, которые нужно вывести) и LIST list (список строк).
  2. Создаются две переменные: count (счетчик количества выводимых символов) и waitflg (флаг ожидания).
  3. Указатель ptr начинает свое движение по списку.
  4. В цикле while (ptr != NULL) происходит обход всех элементов списка.
  5. Если текущий элемент не является последним (т.е. у него есть следующий элемент), и текущий элемент не является символом новой строки ('\n'), то он выводится на экран.
  6. Если текущий элемент является символом новой строки ('\n'), то счетчик count сбрасывается в ноль.
  7. Если текущий элемент не является символом новой строки ('\n'), то он выводится на экран, а счетчик count увеличивается на единицу.
  8. Если текущий элемент является символом новой строки ('\n'), и следующий элемент не является символом новой строки ('\n'), то на экран выводится символ новой строки ('\n').
  9. Указатель ptr перемещается на следующий элемент списка.
  10. Цикл while продолжается до тех пор, пока не будут обработаны все элементы списка.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.714 из 5
Похожие ответы