#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*); // Функция пропуска разделителей и лидирующих пробелов
void reorg(Item*, Item**, Item**); // Преобразование списка
Item* deleteList(Item*); // Удаление списка
// Код программы:
int getList(Item** pptr)
{
char buf[81], * str;
Item head = { '*', 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 >= '0' && *str <= '9') || *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;
}
void reorg(Item* p, Item** chet, Item** nechet)
{
//указатель на последний четный или нечетный элемент
Item* chet_kon = NULL, * nechet_kon = NULL;
//Удалить начальные пробелы
delSpace(&p);
if (p != NULL){
int flag1 = 1, flag2 = 1;
//пока есть символы
while (p) {
//если символ четный
if ((p->c - '0') % 2 == 0) {
//присваиваем новый четный элемент
if (chet_kon != NULL) {
chet_kon->next = p;
chet_kon = chet_kon->next;
flag2 = 1;
}
else {
*chet = p;
chet_kon = p;
flag2 = 1;
}
}
//иначе
else {
if (nechet_kon != NULL) {
//присваиваем новый нечтный
nechet_kon->next = p;
nechet_kon = nechet_kon->next;
flag1 = 1;
}
else {
*nechet = p;
nechet_kon = p;
flag1 = 1;
}
}
//сдвигаем указатель
p = p->next;
//пока пробел
while (delSpace(&p)) {
//если был хотя бы один нечетный элемент
if (flag1) {
//создаем пробел
nechet_kon->next = (Item*)malloc(sizeof(Item));
nechet_kon = nechet_kon->next;
nechet_kon->c = ' ';
flag1 = 0;
}
//если был хотя бы один четный
if (flag2) {
//создаем пробел
chet_kon->next = (Item*)malloc(sizeof(Item));
chet_kon = chet_kon->next;
chet_kon->c = ' ';
flag2 = 0;
}
}
}
}
//присваеваем последний нечетный как пустой
if (nechet_kon) {
//присваеваем последний четный как пустой
nechet_kon->next = NULL;
}
//если был хотя бы олин четный
if (chet_kon) {
//присваеваем последний четный как пустой
chet_kon->next = NULL;
}
}
Item* deleteList(Item* ptr)
{
Item* tmp = NULL;
while (ptr != NULL) {
tmp = ptr;
ptr = ptr->next;
free(tmp);
}
return ptr;
}
int main()
{
Item* st;
Item* chet = NULL;
Item* nechet = 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, &chet, &nechet);
putList("Result string chetn", chet);
putList("Result string nechetn", nechet);
st = deleteList(st);
chet = NULL;
nechet = NULL;
}
}
_getch();
return 0;
}