@kr1337ol

Как отсортировать и вывести чётные элементы списка?

есть код в функции Showb нужно вывести чётные элементы списка отсортированные по возрастанию

#include <iostream>

using namespace std;

struct Node       //Структура являющаяся звеном списка
{
	double x;     //Значение x будет передаваться в список
	Node *Next, *Prev; //Указатели на адреса следующего и предыдущего элементов списка
	
};

class List   //Создаем тип данных Список
{
	Node *Head, *Tail; //Указатели на адреса начала списка и его конца

public:
	List() :Head(NULL), Tail(NULL) {}; //Инициализируем адреса как пустые
	~List(); //Деструктор
	void Show(); //Функция отображения списка на экране
	void Add(double x); //Функция добавления элементов в список
	void Sort();
	void Showa();
	void Showb(int N);
};

List::~List() //Деструктор
{
	while (Head) //Пока по адресу на начало списка что-то есть
	{
		Tail = Head->Next; //Резервная копия адреса следующего звена списка
		delete Head; //Очистка памяти от первого звена
		Head = Tail; //Смена адреса начала на адрес следующего элемента
	}
}

void List::Add(double x)
{
	Node *temp = new Node; //Выделение памяти под новый элемент структуры
	temp->Next = NULL;  //Указываем, что изначально по следующему адресу пусто
	temp->x = x;//Записываем значение в структуру

	if (Head != NULL) //Если список не пуст
	{
		temp->Prev = Tail; //Указываем адрес на предыдущий элемент в соотв. поле
		Tail->Next = temp; //Указываем адрес следующего за хвостом элемента
		Tail = temp; //Меняем адрес хвоста
	}
	else //Если список пустой
	{
		temp->Prev = NULL; //Предыдущий элемент указывает в пустоту
		Head = Tail = temp; //Голова=Хвост=тот элемент, что сейчас добавили
	}
}

void List::Show()
{
	
	Node *temp = Head;
	//Временно указываем на адрес первого элемента
	cout << "Ваш список: ";
	while (temp != NULL) //Пока не встретим пустое значение
	{
		cout << temp->x << " "; //Выводим каждое считанное значение на экран
		temp = temp->Next; //Смена адреса на адрес следующего элемента
	}

	cout << "\n";
}

void List::Showa()
{
	
	Node *temp = Head;
	//Временный указатель на адрес последнего элемента
	cout << "a)  ";
	while (temp != NULL) //Пока не встретится пустое значение
	{
		if (temp->x>=0)
			cout << "|" << temp->x << "|" << " "; //Выводить значение на экран
		temp = temp->Next; //Указываем, что нужен адрес предыдущего элемента
	}
	cout << "\n";

	
}

void List::Showb(int N)
{
	
	Node *tempb = Head;


		//Временный указатель на адрес последнего элемента

		cout << "b) ";
		while (tempb->Next != NULL) //Пока не встретится пустое значение
		{

			{

				tempb = tempb->Next;
				cout << "|" << tempb->x << "|" << " ";
				if (tempb->Next != NULL)
					tempb = tempb->Next;
				else break;


			}


		}

	
		cout << "\n";
}


void List::Sort()
{

	Node * list = Tail; // связанный список
	Node * node, *node2;
	for (node = list; node; node = node->Prev)
		for (node2 = list; node2; node2 = node2->Prev)
			if (node->x > node2->x) { // если число из node меньше числа из node2 то переставляем их
				double i = node->x;
				node->x = node2->x;
				node2->x = i;

			}
	cout << "\n";

}


int main()
{
	setlocale(LC_ALL, "RUS");
	List lst,lst1; //Объявляем переменную, тип которой есть список
	int N;
	cout << "Введите количество элементов:\n";
	cin >> N;
	for (int i = 0; i<N; i++)//ввод списка
	{
		double x;
		cout << "Введите " << i + 1 << " елемент: ";
		cin >> x;
		lst.Add(x);
		lst1.Add(x);
	}




	system("cls");
	lst.Show();     //Отображаем список на экране
	lst.Sort();     //сортировка
	lst.Showa();    //показ положительных
	lst1.Showb(N);  //Показ четных
	cout << "\n";


	system("PAUSE");
}
  • Вопрос задан
  • 1656 просмотров
Решения вопроса 2
Не вижу проблемы. Заводите счетчик и при четных значениях оного в цикле выводите элементы.
Ответ написан
Olej
@Olej
инженер, программист, преподаватель
Сортировка - дорогая операция.
Для вашего случая такие задачи можно решать проще:
- пробегая список, из всех чётных элементов выбираете меньший (или больший ... как больше нраится ;-))
- помещаете его копию в новый список, а элемент чем-то отмечаете
- из не отмеченных чётных опять выбираете экстремальный...
- и так для всех чётных элементов.
По производительности это будет куда менее затратно, чем что-то сортировать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@abcd0x00
Можешь сделать бинарное дерево указателей на чётные элементы и потом его вывести.
Но я бы сделал просто вектор указателей на чётные элементы, отсортировал его и вывел.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы