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