#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*); // Удаление списка
int delNol(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 >= '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;
}
int delNol(Item** p)
{
Item* tmp;
int flag = 0;
while (*p && (*p)->c == '0') { // Пока p не равен 0-байт и (элемент списка не равен 0)
tmp = *p;
(*p) = (*p)->next;
//free(tmp); // Сдвигаем указатель на следующий элемент
flag = 1;
}
if (*p || flag == 0)
{
return flag;
}
else {
return 2;
}
}
Item* reorg(Item* p, Item** chet, Item** nechet)
{
Item* p1 = p;
int flag1 = 0, flag2 = 0;
//указатель на последний четный или нечетный элемент
Item* chet_kon = NULL, * nechet_kon = NULL;
//Удалить начальные пробелы
delSpace(&p);
//удалить начальные нули
while (1) {
int res = delNol(&p);
//если у нас не осталось сиволов
if (res == 2) {
if (chet_kon != NULL) {
if (flag2 == 2) {
chet_kon->next = (Item*)malloc(sizeof(Item));
chet_kon = chet_kon->next;
chet_kon->c = ' ';
}
chet_kon->next = (Item*)malloc(sizeof(Item));
chet_kon = chet_kon->next;
chet_kon->c = '0';
flag2 = 2;
}
else {
*chet = (Item*)malloc(sizeof(Item));
(*chet)->c = '0';
(*chet)->next = NULL;
chet_kon = *chet;
flag2 = 2;
}
}
else {
//если после удаления нуля удалили пробел
if (res == 1 && delSpace(&p)) {
if (chet_kon != NULL) {
if (flag2 == 2) {
chet_kon->next = (Item*)malloc(sizeof(Item));
chet_kon = chet_kon->next;
chet_kon->c = ' ';
}
chet_kon->next = (Item*)malloc(sizeof(Item));
chet_kon = chet_kon->next;
chet_kon->c = '0';
flag2 = 2;
}
else {
*chet = (Item*)malloc(sizeof(Item));
(*chet)->c = '0';
(*chet)->next = NULL;
chet_kon = *chet;
flag2 = 2;
}
}
else {
break;
}
}
}
if (p != NULL){
//пока есть символы
while (p) {
//если символ четный
if ((p->c - '0') % 2 == 0) {
//если были четные цифры
if (chet_kon != NULL) {
//если до этого был удален пробел
if (flag2 == 2) {
if (p->c != '0') {
chet_kon->next = (Item*)malloc(sizeof(Item));
chet_kon = chet_kon->next;
chet_kon->c = ' ';
//присваиваем новый четный элемент
chet_kon->next = p;
chet_kon = chet_kon->next;
flag2 = 1;
}
}
else {
//присваиваем новый четный элемент
chet_kon->next = p;
chet_kon = chet_kon->next;
flag2 = 1;
}
}
else {
if (p->c != '0') {
//присваиваем новый четный элемент
*chet = p;
chet_kon = *chet;
flag2 = 1;
}
}
}
//иначе
else {
//если были нечетные цифры
if (nechet_kon != NULL) {
if (flag1 == 2) {
//создаем пробел
nechet_kon->next = (Item*)malloc(sizeof(Item));
nechet_kon = nechet_kon->next;
nechet_kon->c = ' ';
}
//присваиваем новый нечтный
nechet_kon->next = p;
nechet_kon = nechet_kon->next;
flag1 = 1;
}
else {
*nechet = p;
nechet_kon = *nechet;
flag1 = 1;
}
}
//сдвигаем указатель
p = p->next;
//если пробел
while (delSpace(&p)) {
if (flag1 == 1) {
flag1 = 2;
}
if (flag2 == 1) {
flag2 = 2;
}
//если ноль
if (delNol(&p) != 0) {
//если после нуля пробел или конец строки
if (delSpace(&p) == 1 || p == NULL) {
if (chet_kon != NULL) {
if (flag2 == 2) {
chet_kon->next = (Item*)malloc(sizeof(Item));
chet_kon = chet_kon->next;
chet_kon->c = ' ';
}
chet_kon->next = (Item*)malloc(sizeof(Item));
chet_kon = chet_kon->next;
chet_kon->c = '0';
flag2 = 2;
}
else {
*chet = (Item*)malloc(sizeof(Item));
(*chet)->c = '0';
(*chet)->next = NULL;
chet_kon = *chet;
flag2 = 2;
}
}
}
}
}
}
//присваеваем последний нечетный как пустой
if (nechet_kon) {
//присваеваем последний четный как пустой
nechet_kon->next = NULL;
}
//если был хотя бы олин четный
if (chet_kon) {
//присваеваем последний четный как пустой
chet_kon->next = NULL;
}
return p1;
}
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) {
st = reorg(st, &chet, &nechet);
putList("Result string chetn", chet);
putList("Result string nechetn", nechet);
st = deleteList(st);
chet = NULL;
nechet = NULL;
}
}
_getch();
return 0;
}