Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2018, 20:21   #1
holber
 
Регистрация: 12.06.2018
Сообщений: 7
По умолчанию Найти самую длинную неубывающую подпоследовательность данной последовательности с использованием списков

Код:
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <locale.h>

using namespace std;

struct list
{
	int info;
	list *p;
	list *pred, *next;
};

void insert(list * head, list * tail, list * p);
void makelist(list * & head, list * & tail);
void printlist(list* head, list* tail);


void insert(list * head, list * tail, list * p)
{
	if (p)
	{
		p->next = tail;
		p->pred = tail->pred;
		tail->pred = p;
		p->pred->next = p;
	}
	else
		cout << "Ошибка!" << endl;
}

void makelist(list * &head, list * &tail)
{
	head = new list;
	tail = new list;
	head->next = tail;
	tail->pred = head;
	cout << "Введите числа. Для завершения введите 0:" << endl;
	int k;
	cin >> k;
	while (k != 0){
		list*p = new list;
		p->info = k;
		insert(head, tail, p);
		cin >> k;
	}
	return;
}

void printlist(list* head, list* tail)
{
	if (head && tail)
	{
		list * p = head->next;
		while (p != tail){
			cout << p->info << ends;
			p = p->next;
		}
	}
	return;
}

void main()
{
	setlocale(LC_ALL, "Russian");
	list *head, *tail;

	makelist(head, tail);
	cout << "Исходный список:" << endl;

	printlist(head, tail);

	cout << "" << endl;
	system("pause");
}
Помогите реализовать поиск неубывающей подпоследовательности
holber вне форума Ответить с цитированием
Старый 12.06.2018, 21:06   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

В чём именно проблема?
Сделать копию функции printlist (с другим именем, конечно)
На каждой итерации сравнивать значение p->info с предыдущим её значением (заранее сохранённым).
eoln вне форума Ответить с цитированием
Старый 12.06.2018, 21:38   #3
holber
 
Регистрация: 12.06.2018
Сообщений: 7
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
В чём именно проблема?
.
Не знаю как создать функцию ,которая будет находить самую длинную неубывающую подпоследовательность из данной последовательности
holber вне форума Ответить с цитированием
Старый 13.06.2018, 13:13   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от holber Посмотреть сообщение
Не знаю как создать функцию ,которая будет находить самую длинную неубывающую подпоследовательность из данной последовательности
Эмс...

Голова пустая. В смысле голова списка , там неиспользуемая память, но это не ошибка.

Можно в лоб
Код:
void print_min_list(list* head, list* tail)
{
	if (head && tail)
	{
		list * p = head->next;
		list * my_start = head->next;
		list * my_tmp_start = head->next;
		int my_length = 0;
		int my_tmp_length = 0;
		int my_last_info = head->info;
		while (p != tail){
			if (p->info >= my_last_info) my_tmp_length++;//считаем кол-во неубывающих
			if ((p->info < my_last_info)||(p->next == tail))//если цепочка кончилась
			{
				if (my_tmp_length > my_length)//если она максимальная
				{
					my_start = my_tmp_start;//то запомним её начало
					my_length = my_tmp_length;//и длину
				}
				my_tmp_start = p;
				my_tmp_length = 1;
			}
			my_last_info = p->info;
			p = p->next;
		}

		//вывод
		p = my_start;
		for (int j=0;j<my_length;j++){
			cout << p->info << ends;
			p = p->next;
		}
	}
	return;
}
Хотя в данном случае лучше искать невозрастающую последовательность, а затем вывести её задом наперёд. В этом случае не нужно хранить адрес начала претендента на место самой длинной цепочки, и код уменьшится в раза 1,5
eoln вне форума Ответить с цитированием
Старый 13.06.2018, 14:09   #5
holber
 
Регистрация: 12.06.2018
Сообщений: 7
По умолчанию

Спасибо вам большое
holber вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти самую длинную группу цифр (двумерный массив) fr0st1k123 Общие вопросы C/C++ 1 11.03.2016 19:56
Найти в массиве самую длинную убывающую последовательность... fr0st1k123 Общие вопросы C/C++ 1 19.10.2015 20:34
В заданном предложении(т.е любом) найти самую длинную подпоследовательность слов (C++) fierygolemm Помощь студентам 2 25.03.2015 10:32
Работа с файлами .Найти самую длинную и самую короткую строки. britannia C# (си шарп) 1 03.06.2011 13:45
Найти самую длинную подпоследовательность состоящую только из нулей, С++ StudentPolitech Помощь студентам 7 28.11.2008 09:16