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

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

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

помогите пожалуйста переделать прогу с использоанием односвязных списков, а то я понятия не имею что это..
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <conio.h>
  4. void AddSpaces(char str[256], char cstr[256]); // прототип
  5. void main()
  6. {
  7. char str[256]; // это строка
  8. char cstr[256];
  9. AddSpaces(str,cstr);
  10. puts(cstr);// выводим то что у нас получилось
  11. _getch();
  12. }
  13. void AddSpaces(char str[256], char cstr[256])
  14. {
  15. char spaces[20] = {" "}; // массив пробелов
  16. gets(str); // ввод строки с клавиатуры
  17. strcpy(cstr,str); // создаем копию(копируем из str в cstr)
  18. char * pch; // указатель на символы
  19. int max_len = 0 ; // длина максимального слова
  20. int length; // длина отдельно взятого слова
  21. int dif; // разница в длине
  22. pch = strtok(cstr," "); // указатель указывает на первое слово строки(то что до первого пробела)
  23. while(pch != NULL)
  24. {
  25. length = strlen(pch); // длина слова
  26. if(max_len < length) max_len = length; // выводим максимальную длину слова
  27. pch = strtok(NULL," "); // переходим к следующему слову
  28. }
  29. strcpy(cstr,""); // теперь cstr пустая строка
  30. pch = strtok(str," "); // берем первое слово из str
  31. while(pch != NULL)
  32. {
  33. length = strlen(pch); // измеряем его длину
  34. dif = max_len - length; // сравниваем с максимальной
  35. strcat(cstr,pch); // присоединяем его к cstr
  36. strncat(cstr,spaces,dif); // присоединяем к cstr из spaces кол-во пробелов(dif)
  37. pch = strtok(NULL," "); // и так далее до конца строки
  38. }
  39. }

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <time.h>
  4. #include <stdlib.h>
  5.  
  6. typedef struct ListElement {
  7.   struct ListElement *next;
  8.   char *data;
  9. } ListElement;
  10.  
  11. typedef struct {
  12.   size_t size;
  13.   ListElement *first;
  14. } List;
  15.  
  16. void ListPushBack(List *list, const char *string) {
  17.   ListElement *new_element = (ListElement*)malloc(sizeof(ListElement));
  18.   new_element->next = NULL;
  19.   new_element->data = strcpy((char*)malloc(strlen(string) + 1), string);
  20.   if (list->first == NULL) {
  21.     list->first = new_element;
  22.   } else {
  23.     ListElement *last = list->first;
  24.     while (last->next != NULL)
  25.       last = last->next;
  26.     last->next = new_element;
  27.   }
  28.   ++list->size;
  29. }
  30.  
  31. void ListFree(List *list) {
  32.   while (list->first != NULL) {
  33.     ListElement *next = list->first->next;
  34.     free(list->first->data);
  35.     free(list->first);
  36.     list->first = next;
  37.   }
  38.   list->size = 0;
  39. }
  40.  
  41. char *GetString(char *buffer, size_t buffer_size) {
  42.   fgets(buffer, buffer_size, stdin);
  43.   buffer[strlen(buffer) - 1] = '\0'; // Get rid of \n.
  44.   if (feof(stdin))
  45.     return NULL;
  46.   return buffer;
  47. }
  48.  
  49. size_t FindMaximumStringLength(List *list) {
  50.   size_t result = 0;
  51.   ListElement *element = list->first;
  52.   while (element != NULL) {
  53.     size_t this_string_length = strlen(element->data);
  54.     if (this_string_length > result)
  55.       result = this_string_length;
  56.     element = element->next;
  57.   }
  58.   return result;
  59. }
  60.  
  61. void ListAlignStrings(List *list, size_t new_string_size) {
  62.   ListElement *element = list->first;
  63.   while (element != NULL) {
  64.     char *new_data = (char*)malloc(new_string_size + 1);
  65.     memset(new_data, ' ', new_string_size);
  66.     memcpy(new_data, element->data, strlen(element->data));
  67.     new_data[new_string_size] = '\0';
  68.     free(element->data);
  69.     element->data = new_data;
  70.     element = element->next;
  71.   }
  72. }
  73.  
  74. void ListPrint(List *list) {
  75.   ListElement *element = list->first;
  76.   while (element != NULL) {
  77.     printf("%s|<- Spaces till here.\n", element->data);
  78.     element = element->next;
  79.   }
  80. }
  81.  
  82. int main(int argc, char *argv[]) {
  83.   srand(time(NULL));
  84.   int buffer_size = 4096;
  85.   char *buffer = (char*)malloc(buffer_size);
  86.  
  87.   printf("End input with Ctrl+Z for Windows || Ctrl+D for linux/BSD.\n");
  88.  
  89.   List string_list = { 0, NULL };
  90.   while (GetString(buffer, buffer_size) != NULL) {
  91.     ListPushBack(&string_list, buffer);
  92.   }
  93.  
  94.   size_t maximum_string_length = FindMaximumStringLength(&string_list);
  95.   ListAlignStrings(&string_list, maximum_string_length);
  96.   ListPrint(&string_list);
  97.  
  98.   printf("Max: %d, line(s): %d\n", maximum_string_length, string_list.size);
  99.   ListFree(&string_list);
  100.  
  101.   free(buffer);
  102.   return 0;
  103. }

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

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

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


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

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

12   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы