Переделать программу с использоанием односвязных списков - C (СИ)

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

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

помогите пожалуйста переделать прогу с использоанием односвязных списков, а то я понятия не имею что это..
#include <stdio.h>
#include <string.h>
#include <conio.h>
 
void AddSpaces(char str[256], char cstr[256]); // прототип
 
void main()
{
        char str[256]; // это строка 
                char cstr[256];
                AddSpaces(str,cstr);
puts(cstr);// выводим то что у нас получилось
_getch();
}
 
void AddSpaces(char str[256], char cstr[256])
{
        char spaces[20] = {"          "}; // массив пробелов
        gets(str); // ввод строки с клавиатуры
        strcpy(cstr,str); // создаем копию(копируем из str в cstr)
        char * pch; // указатель на символы
        int max_len = 0 ; // длина максимального слова
        int length; // длина отдельно взятого слова
        int dif; // разница в длине
pch = strtok(cstr," "); // указатель указывает на первое слово строки(то что до первого пробела)
while(pch != NULL)
{       
length = strlen(pch); // длина слова
if(max_len < length) max_len = length; // выводим максимальную длину слова
pch = strtok(NULL," "); // переходим к следующему слову
}
 
strcpy(cstr,""); // теперь cstr пустая строка
pch = strtok(str," "); // берем первое слово из str
 
while(pch != NULL)
{
length = strlen(pch); // измеряем его длину
dif = max_len - length; // сравниваем с максимальной
strcat(cstr,pch); // присоединяем его к cstr
strncat(cstr,spaces,dif); // присоединяем к cstr из spaces кол-во пробелов(dif)
pch = strtok(NULL," "); // и так далее до конца строки
}
}

Решение задачи: «Переделать программу с использоанием односвязных списков»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
 
typedef struct ListElement {
  struct ListElement *next;
  char *data;
} ListElement;
 
typedef struct {
  size_t size;
  ListElement *first;
} List;
 
void ListPushBack(List *list, const char *string) {
  ListElement *new_element = (ListElement*)malloc(sizeof(ListElement));
  new_element->next = NULL;
  new_element->data = strcpy((char*)malloc(strlen(string) + 1), string);
  if (list->first == NULL) {
    list->first = new_element;
  } else {
    ListElement *last = list->first;
    while (last->next != NULL)
      last = last->next;
    last->next = new_element;
  }
  ++list->size;
}
 
void ListFree(List *list) {
  while (list->first != NULL) {
    ListElement *next = list->first->next;
    free(list->first->data);
    free(list->first);
    list->first = next;
  }
  list->size = 0;
}
 
char *GetString(char *buffer, size_t buffer_size) {
  fgets(buffer, buffer_size, stdin);
  buffer[strlen(buffer) - 1] = '\0'; // Get rid of \n.
  if (feof(stdin))
    return NULL;
  return buffer; 
}
 
size_t FindMaximumStringLength(List *list) {
  size_t result = 0;
  ListElement *element = list->first;
  while (element != NULL) {
    size_t this_string_length = strlen(element->data);
    if (this_string_length > result)
      result = this_string_length;
    element = element->next;
  }
  return result;
}
 
void ListAlignStrings(List *list, size_t new_string_size) {
  ListElement *element = list->first;
  while (element != NULL) {
    char *new_data = (char*)malloc(new_string_size + 1);
    memset(new_data, ' ', new_string_size);
    memcpy(new_data, element->data, strlen(element->data));
    new_data[new_string_size] = '\0';
    free(element->data);
    element->data = new_data;
    element = element->next;
  }
}
 
void ListPrint(List *list) {
  ListElement *element = list->first;
  while (element != NULL) {
    printf("%s|<- Spaces till here.\n", element->data);
    element = element->next;
  }
}
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
  int buffer_size = 4096;
  char *buffer = (char*)malloc(buffer_size);
 
  printf("End input with Ctrl+Z for Windows || Ctrl+D for linux/BSD.\n");
 
  List string_list = { 0, NULL };
  while (GetString(buffer, buffer_size) != NULL) {
    ListPushBack(&string_list, buffer);
  }
 
  size_t maximum_string_length = FindMaximumStringLength(&string_list);
  ListAlignStrings(&string_list, maximum_string_length);
  ListPrint(&string_list);
 
  printf("Max: %d, line(s): %d\n", maximum_string_length, string_list.size);
  ListFree(&string_list);
 
  free(buffer);
  return 0;
}

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

  1. Создание структуры для хранения элемента списка.
  2. Создание структуры для хранения списка.
  3. Добавление элемента в список.
  4. Удаление всех элементов из списка.
  5. Получение максимальной длины строки в списке.
  6. Выравнивание строк в списке.
  7. Вывод списка на экран.
  8. Инициализация переменной для хранения размера буфера.
  9. Выделение памяти под буфер.
  10. Ввод строк и добавление их в список до тех пор, пока не будет введен пустой строки.
  11. Вычисление максимального размера строки в списке.
  12. Выравнивание строк в списке по максимальному размеру.
  13. Вывод списка на экран.
  14. Вывод сообщения о размере списка и максимальной длине строки.
  15. Освобождение памяти, выделенной под буфер.
  16. Освобождение памяти, выделенной под списки.
  17. Завершение программы.

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


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

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

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