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

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

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

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

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

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

Список из n целых чисел a1, a2, ..., an, Удалить элементы равные полусумме своих соседей в Исходном списке.Помогите пожалуйста
Например при вводе при тестировании на списке 12359 не правильно выводит результат: 91 ,удаление должно происходить в исходном списке
Код:
#include <iostream>
using namespace std;

struct element //Структура с инфополями и адресным полем
{
	int x; //Инфополе. значения из x будут передаваться в список
	element *Next; //Адресное поле
};

class List //Класс Список
{
	element *Head; //Указатель на последний активный элемент или просто голова списка
public:
	List() { Head = NULL; } //Конструктор и инициализация указателя пустым значением
	~List(); //Деструктор
	void Add(int x); //Функция для добавления значений в список
	void Show(); //Функция для отображения списка на экране
	bool try_to_del_element();
	void dell_them_all();
	void PoslList();
};

List::~List() //Деструктор вынесен за класс
{
	while (Head)  //Пока по адресу не пусто 
	{
		element *temp = Head->Next; //Временная переменная для хранения адреса следующего элемента
		delete Head; //Освобождаем адрес обозначающий начало
		Head = temp; //Меняем адрес на следующий
	}
}

void List::Add(int x) //Функция добавления элементов в список
{
	element *temp = new element; //При каждом вызове выделяется память
	temp->x = x; //Записываем x в элемент структуры  element (в x структуры element)
	temp->Next = Head; //Указываем, что след. элемент это объект по адресу Head
	Head = temp; //Указываем, что последний активный элемент это только что введенный
}

void List::Show() //Функция отображения списка на экране
{
	element *temp = Head; //Определяем указатель, который изначально он равен адресу начала списка

	while (temp != NULL) //До тех пор пока не встретит пустое значение
	{
		cout << temp->x << " "; //Выведет элемент x из списка
		temp = temp->Next; //Указываем, что далее нам нужен следующий элемент
	}
}

bool List::try_to_del_element() // при вводе 1 2 3 5 9 // удалит элементы пока не false
{
	bool deleted = false;
	element *prev, *current, *next;
	current = Head;
	while ((prev = current) != NULL && (current = prev->Next) != NULL && (next = current->Next) != NULL)
	{
		if (prev->x + next->x == 2 * current->x)
		{
			prev->Next = next;
			delete current;
			current = next;
			deleted = true;
		}
	}
	return deleted;
}

void List::dell_them_all()
{
	while (try_to_del_element());
}

int main()
{
	setlocale(0, "rus");
	int N; //Число элементов в список
	int x; //Элементы вводимые в список
	List lst; //Переменная, тип которой список

	cout << "Введите размер списка: ";//7
	cin >> N; //Указали сколько элементов вводить в список

	for (int i = 0; i<N; i++)
	{
		cout << "A[" << i + 1 << "] = ";// 1 2 3 4 6 9 11
		cin >> x; //Ввод x с клавиатуры
		lst.Add(x); //Добавление элемента в список
	}
	cout << "\nТекущий список:\n";
	lst.Show(); //Вывод списка на экран

	lst.dell_them_all();
	cout << "\nРезультат:\n";
	lst.Show();// 1 2 6 9 11 удалены 3 и 4 
	system("pause");
	return 0;
}
holber вне форума Ответить с цитированием
Старый 14.06.2018, 14:21   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от holber Посмотреть сообщение
при тестировании на списке 12359 не правильно выводит результат: 91
ну да, должен получится список 1 9
1 2 3 5 9 (2 = (1+3)/2) => 1 3 5 9 =>
1 3 5 9 ( 3 = (1+5)/2 ) => 1 5 9 =>
1 5 9 ( 5 = (1+9) / 2 ) => 1 9
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.06.2018, 15:29   #3
holber
 
Регистрация: 12.06.2018
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ну да, должен получится список 1 9
Факт в том, что препод сказал, должно остаться 159.Т.к список уже поменялся.А в условии мол написано, что нужно удалить элементы в исходном списке
holber вне форума Ответить с цитированием
Старый 14.06.2018, 15:31   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Факт в том, что препод сказал, должно остаться 159.Т.к список уже поменялся.А в условии мол написано, что нужно удалить элементы в исходном списке
тогда и тройку не надо удалять по той же причине
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.06.2018, 15:36   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от holber Посмотреть сообщение
Факт в том, что препод сказал, должно остаться 159
ошибается ваш препод.
спросите его, куда из списка делась тройка ("3").
и чем пятёрка хуже тройки.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.06.2018, 16:00   #6
holber
 
Регистрация: 12.06.2018
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
тогда и тройку не надо удалять по той же причине
Допустим, что 3 тоже должна остаться, как изменить тогда данную функцию
holber вне форума Ответить с цитированием
Старый 14.06.2018, 16:31   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от holber Посмотреть сообщение
Допустим, что 3 тоже должна остаться, как изменить тогда данную функцию
вызвать вместо метода удаления всех
Цитата:
Сообщение от holber Посмотреть сообщение
Код:
List::dell_them_all()
метод

Цитата:
Сообщение от holber Посмотреть сообщение
Код:
List::try_to_del_element()
Код:
	cout << "\nТекущий список:\n";
	lst.Show(); //Вывод списка на экран

	lst.try_to_del_element();
	cout << "\nРезультат:\n";
	lst.Show();// 1 2 6 9 11 удалены 3 и 4
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.06.2018, 16:58   #8
holber
 
Регистрация: 12.06.2018
Сообщений: 7
По умолчанию

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


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найдите трехзначные числа, равные сумме кубов своих цифр. Подсчет суммы кубов организовать в виде функции. Julia_Sv Паскаль, Turbo Pascal, PascalABC.NET 0 02.04.2016 13:32
Задан одномерный массив. Все его элементы, не равные нулю Vadim228 Паскаль, Turbo Pascal, PascalABC.NET 5 23.12.2015 07:59
Перенести все элементы равные K в конец Cip Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 11.12.2015 23:25
Удалить из массива все элементы, равные х. Biohazard251 Паскаль, Turbo Pascal, PascalABC.NET 4 18.12.2012 10:12
Удалить столбцы содержащие элементы равные 0 на Visual Basic .NET Monqer Помощь студентам 0 13.02.2012 21:27