#define _CRT_SECURE_NO_WARNINGS
//#include "stdafx.h"
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
typedef struct Item { // Структура - элемент списка
char c; // Информационное поле списка, символ
struct Item* next; // Указатель на следующий элемент списка
} Item; // Создание экземпляра струткруры с именем Item
// Используемые прототипы функций:
int getList(Item**); // Создание списка
void putList(Item*); // Вывод списка
Item* delSpace(Item*); // Функция пропуска разделителей и лидирующих пробелов
Item* reorg(Item*, Item**, Item**); // Преобразование списка
Item* deleteList(Item*); // Удаление списка
Item* addSlovo(Item*, Item*);// Добавление слова
// Код программы:
int getList(Item** pptr)
{
char buf[81], * str;
Item* head; // Указатель на головной эл-т списка
head = (Item*)malloc(sizeof(Item));
head->c = '*';
head->next = NULL;
Item* last = head; // Значению поля
int n, rc = 1;
do {
//разрешаем ввод только английских символов, пока не нажат перевод строки
n = scanf("%80[^\n]", buf);
if (n < 0) {
deleteList(head->next);
head->next = NULL;
rc = 0;
return 0;
}
if (n > 0) {
for (str = buf; *str != '\0'; ++str) {
if ((*str >= 'a' && *str <= 'z') || (*str >= 'A' && *str <= 'Z') || *str == ' ' || *str == '\t') {
last->next = (Item*)malloc(sizeof(Item));
last = last->next;
last->next = NULL;
last->c = *str;
}
else {
scanf("%*c");
deleteList(head->next);
head->next = NULL;
rc = 0;
return 2;
}
}
last->next = NULL;
}
else
scanf("%*c");
} while (n > 0);
*pptr = head->next;
return rc;
}
void putList(const char* msg, Item* ptr)
{
printf("%s: \"", msg);
for (; ptr != NULL; ptr = ptr->next)
printf("%c", ptr->c);
printf("\"\n");
}
int delSpace(Item** p)
{
Item* tmp;
int flag = 0;
while (*p && ((*p)->c == ' ' || (*p)->c == '\t')) { // Пока p не равен 0-байт и (элемент списка не равен 0 или табуляции)
tmp = *p;
(*p) = (*p)->next;
//free(tmp); // Сдвигаем указатель на следующий элемент
flag = 1;
}
return flag;
}
Item* addSlovo(Item* p, Item* slovo) {
//запоминаем начало
Item* nach = p;
//если у нас есть уже список слов
if (p) {
nach = p;
while (p->next) {
p = p->next;
}
//добавляем пробел
p->next = (Item*)malloc(sizeof(Item));
p = p->next;
p->c = ' ';
p->next = NULL;
}
//добавляем слово
//пока есть символ в слове
while (slovo->next) {
Item* prom = slovo;
Item* pred = NULL;
while (prom->next) {
pred = prom;
prom = prom->next;
}
if (p) {
p->next = prom;
p = p->next;
}
else {
p = prom;
nach = p;
}
pred->next = NULL;
}
p->next = slovo;
return nach;
}
void reorg(Item* p, Item** sp)
{
//указатель на начало слово и конец
Item* slovo = NULL, *posl_slovo = NULL;
//список слов
Item* sp_slov = NULL;
//Удалить начальные пробелы
delSpace(&p);
if (p != NULL) {
//пока есть символы
while (p) {
//если есть последний символ
if (posl_slovo) {
//запоминаем новый последний символ
posl_slovo->next = p;
posl_slovo = posl_slovo->next;
p = p->next;
posl_slovo->next = NULL;
}
else {
//запоминаем новый начальный и последний символ
slovo = p;
posl_slovo = p;
p = p->next;
posl_slovo->next = NULL;
}
//если пробел
if (delSpace(&p)) {
//добавляем слово в список слов
sp_slov = addSlovo(sp_slov, slovo);
slovo = NULL;
posl_slovo = NULL;
}
}
}
//если есть не добавленное слово
if (slovo) {
//добавляем его
sp_slov = addSlovo(sp_slov, slovo);
}
*sp = sp_slov;
}
Item* deleteList(Item* ptr)
{
Item* tmp = NULL;
while (ptr != NULL) {
tmp = ptr;
ptr = ptr->next;
free(tmp);
}
return ptr;
}
int main()
{
Item* st;
Item* sp = NULL;
while (1) {
puts("Enter string, please:");
int res = getList(&st);
if (res == 0) {
break;
}
else {
if (res == 2) {
puts("You enter wrong symbol");
continue;
}
}
putList("Entered string", st);
if (st != NULL) {
reorg(st, &sp);
putList("Result string chetn", sp);
sp = deleteList(sp);
st = NULL;
}
}
_getch();
return 0;
}