Как вставить число после подпоследовательности?
Написал программу, которая раскладывает по порядку числа из файла.
Но нужно, чтобы после первой подпоследовательности (состоящей из нечетных чисел) вставляло число 0.
Подскажите как это сделать (написать)?
код:
#include <fstream>
#include "Header.h"
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int main()
{
TList list;
ifstream file ("input.txt");
if (!file)
{
cout << "File not found!\n";
}
else
{
Create_Order(list, file);
Print(list);
Clear(list);
file.close();
}
cin.get();
return 0;
}
Header.h
#pragma once
#include <fstream>
struct Node
{
int info;
Node* next;
};
typedef Node* TList;
void Init(TList& list);
bool Empty(TList list);
void Add(TList& list, int new_elem);
int Delete(TList& list);
void Create_Order(TList& list, std::ifstream& file);
void Print(TList list);
void Clear(TList& list);
Header.cpp
void Init(TList& list)
{
list = NULL;
}
bool Empty(TList list)
{
return list == NULL;
}
void Add(TList& list, int new_elem)
{
TList p = new Node;
p->info = new_elem;
p->next = list;
list = p;
}
int Delete(TList& list)
{
TList p = list;
list = p->next;
int elem = p->info;
p->next = NULL;
delete p;
return elem;
}
TList Found_place(TList list, int elem)
{
TList Q = list;
while (Q->next != NULL && Q->next->info < elem)
Q = Q->next;
return Q;
}
void Create_Order(TList& list, std::ifstream& file)
{
Init(list);
int x;
file >> x;
Add(list, x); // или Add_to_head(list, x)
while (!file.eof())
{
file >> x;
if (x < list->info)
Add(list, x); // или Add_to_head(list, x)
else
{
TList place = Found_place(list, x);
Add(place->next, x);//или Add_after_Node(place,x)
}
}
}
void Print(TList list)
{
TList p = list;
while (p != NULL)
{
std::cout << p->info << " ";
p = p->next;
}
std::cout << std::endl;
}
void Clear(TList& list)
{
while (!Empty(list))
Delete(list); // или Delete_from_head(list)
}
Ответы (1 шт):
Автор решения: Павел Ериков
→ Ссылка
Вот пример функции Add_Zero, которая вставляет 0 после первой подпоследовательности нечетных чисел.
Сразу скажу протестируйте пожалуйста по максимуму, т.к. у меня нет возможности протестировать у себя, но вроде должно работать :)
void Add_Zero(TList& list) {
TList Q = list;
//Пропускаем сначала четные
while (Q->next != NULL && Q->info % 2 == 0)
Q = Q->next;
//true - если не конец списка, то есть началась нечетная подпоследовательность
bool isSubsequense = Q->info % 2 == 1;
//Указатель на последний элемент подпоследовательности
TList last = Q;
//Потом идем в конец первой нечетной подпоследовательности
while (Q->next != NULL && Q->next->info % 2 == 1) {
Q = Q->next;
last = Q;
}
//Если подпоследовательность есть
if (isSubsequense) {
TList newElem = new Node;
newElem->info = 0;
//Если последний элемент этой подпоследовательности
//находится в конце списка, то просто добавить в конец 0
if (last->next == NULL) {
newElem->next = NULL;
last->next = newElem;
}
//Иначе вставляем между элементам
else {
Q = last->next;
last->next = newElem;
newElem->next = Q;
}
}
}