Переделать программу с использоанием односвязных списков - 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; }
Объяснение кода листинга программы
- Создание структуры для хранения элемента списка.
- Создание структуры для хранения списка.
- Добавление элемента в список.
- Удаление всех элементов из списка.
- Получение максимальной длины строки в списке.
- Выравнивание строк в списке.
- Вывод списка на экран.
- Инициализация переменной для хранения размера буфера.
- Выделение памяти под буфер.
- Ввод строк и добавление их в список до тех пор, пока не будет введен пустой строки.
- Вычисление максимального размера строки в списке.
- Выравнивание строк в списке по максимальному размеру.
- Вывод списка на экран.
- Вывод сообщения о размере списка и максимальной длине строки.
- Освобождение памяти, выделенной под буфер.
- Освобождение памяти, выделенной под списки.
- Завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д