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