@xxxJTxxx

Как отсортировать структуру по полю?

Всем доброго времени суток. Пишу программу "Домашняя кинотека" с использованием графического интерфейса. Имеется структура, которая содержит в себе данные о фильме (название, год производства, страну производства, режиссёра и т.д.).
Задание таково: Пользователь пишет имя режиссёра, и ему выдаётся таблица с фильмами этого режиссёра со списком фильмов, отсортированные по названию фильма. Сделал лишь только так, чтобы выдавал нужного режиссёра, с сортировкой разобраться не могу. За помощь буду признателен, часть программы (сама структура, создание, добавление элемента прилагаю).
// Структура для описания фильма из кинотеки
struct Film
{
	std::string name; // Название
	std::string style; // Жанр
	std::string country; // Страна
	std::string year; //Год
	std::string producer; // Тип
	std::string quality; // Качество
	std::string sound; // Озвучка
	std::string continuity; // Продолжительность

	Film* link; // Указатель на следующий элемент списка
};


// Создание первого  элемента списка
void FilmStore::createfirstpart(Film f)
{ // Создаём элемент и инициалицируем
	head = new Film;
	head->name = f.name;
	head->style = f.style;
	head->country = f.country;
	head->year = f.year;
	head->producer = f.producer;
	head->quality = f.quality;
	head->sound = f.sound;
	head->continuity = f.continuity;
	head->link = NULL;
	isEmpty = false;//Изначально стоит в true
}
// Добавить в конец списка
void FilmStore::addparttoend(Film f)
{
	if (!isEmpty) // Если список не пуст
	{
		Film* current = head;// Устанавливаем указатель на начало списка
		Film* tmp = NULL;
		while (current->link) // Проходим до конца списка
		{
			current = current->link;
		}
		// Выделение память под эл-т и его инициализация
		tmp = new Film;
		tmp->name = f.name;
		tmp->style = f.style;
		tmp->country = f.country;
		tmp->year = f.year;
		tmp->producer = f.producer;
		tmp->quality = f.quality;
		tmp->sound = f.sound;
		tmp->continuity = f.continuity;
		tmp->link = NULL;
		// Устанавливаем связь текущего элемента на новый узел
		current->link = tmp;
	}
}
// Добавить после указанного
int FilmStore::addpart(Film f, int indexToAddAfter)
{
	if (isEmpty) // Если список пуст 
		return 1; // Возвращаем код ошибки
	else
	{
		int i = 1; // Устанавливаем счётчик на 1 (индексация с 1)
		bool found = false; // Устанавливаем флаг нахождения в false
		Film* current = head; // Устанавливаем указатель на начало списка
		while (current && !found) // Пока не конец списка или пока не найден элемент
		{
			if (i == indexToAddAfter) // Если номер элемента совпал с искомым
			{
				// Выделяем память под новый узел списка
				Film* tmp = new Film;
				tmp->link = current->link; // Устанавливаем связь созданного узла на эл-т, следующий за текущим
				current->link = tmp; // Устанавливаем связь текущего узла на созданный эл-т

				// Инициализируем созданный эл-т переданным значением
				tmp->name = f.name;
				tmp->style = f.style;
				tmp->country = f.country;
				tmp->year = f.year;
				tmp->producer = f.producer;
				tmp->quality = f.quality;
				tmp->sound = f.sound;
				tmp->continuity = f.continuity;

				// Устанавливаем флаг в true, чтобы выйти из цикла
				found = true;
			}
			i++; // Увеличиваем счётчик
			current = current->link; // Переходим к следующему элементу
		}
		if (!found) // Если элемент так и не был найден
			return 2; // Возвращаем код ошибки
	} return 0; // Сообщаем об успешном завершении функции
}
// Добавление в начало списка
int FilmStore::addfirstpart(Film f)
{
	if (isEmpty)
		return 1; // Сообщаем, что список пуст
	else
	{
		// Выделяем память под новый элемент
		Film* tmp = new Film;
		tmp->link = head; // Устанавливаем его связь на начало списка
		head = tmp; // Передаём в указатель на начало списка адрес нового эл-та

		// Инициализируем этот эл-т переданным значением
		tmp->name = f.name;
		tmp->style = f.style;
		tmp->country = f.country;
		tmp->year = f.year;
		tmp->producer = f.producer;
		tmp->quality = f.quality;
		tmp->sound = f.sound;
		tmp->continuity = f.continuity;
	} return 0; // Сообщаем, что функция сработала успешно
}

/*Код ниже находится в другом файле*/
if (act == Action::task4) // Вывод на экран фильмов определённого режиссёра
		{
			// Устанавливаем указатели
			head = FS->retlist();
			current = head;

			if (FS->emptyl())//пуст ли список
				return;

			dataGridViewForList->DataSource = NULL;

			int i = 1;
			int counts = 0;
			DataTable^ table; //Невидимая таблица данных
			DataColumn^ column; //Столбец таблицы
			DataRow^ row; //Строка таблицы

			//Создание таблицы данных
			table = gcnew DataTable();

			//Названия столбцов
			String^ Column1 = "№";
			String^ Column2 = "Название";
			String^ Column3 = "Жанр";
			String^ Column4 = "Страна производства";
			String^ Column5 = "Год";
			String^ Column6 = "Режиссёр";
			String^ Column7 = "Качество";
			String^ Column8 = "Озвучка";
			String^ Column9 = "Продолжительность";

			//Создание и добавление столбцов 
			column = gcnew DataColumn(Column1, Int32::typeid);
			table->Columns->Add(column);
			column = gcnew DataColumn(Column2, String::typeid);
			table->Columns->Add(column);
			column = gcnew DataColumn(Column3, String::typeid);
			table->Columns->Add(column);
			column = gcnew DataColumn(Column4, String::typeid);
			table->Columns->Add(column);
			column = gcnew DataColumn(Column5, Int32::typeid);
			table->Columns->Add(column);
			column = gcnew DataColumn(Column6, String::typeid);
			table->Columns->Add(column);
			column = gcnew DataColumn(Column7, String::typeid);
			table->Columns->Add(column);
			column = gcnew DataColumn(Column8, String::typeid);
			table->Columns->Add(column);
			column = gcnew DataColumn(Column9, Int32::typeid);
			table->Columns->Add(column);
			
			while (current != NULL) {
				//Заполнение строки таблицы
				row = table->NewRow();
				row[Column1] = i;
				row[Column2] = context.marshal_as<String^>(current->name);
				row[Column3] = context.marshal_as<String^>(current->style);
				row[Column4] = context.marshal_as<String^>(current->country);
				row[Column5] = context.marshal_as<String^>(current->year);
				row[Column6] = context.marshal_as<String^>(current->producer);
				row[Column7] = context.marshal_as<String^>(current->quality);
				row[Column8] = context.marshal_as<String^>(current->sound);
				row[Column9] = context.marshal_as<String^>(current->continuity);

				// Единственное отличие - в таблицу добавляются лишь те элементы, где ФИО совпадают
				if (textBox3->Text->ToString() == row[Column6]->ToString())
				{
					counts++;
					table->Rows->Add(row);//добавление
				
				}
				i++;
				current = current->link;
			}

			//Вывод таблицы
			dataGridViewForList->DataSource = table;
			if (counts == 0)
				MessageBox::Show("Поиск не дал результата!");
			current = head;
		}
// Переходим в режим ожидания
		act = Action::nul;

		// Очищаем текстовые поля
		textBox1->Clear();

		textBox3->Clear();

		return System::Void();
	}

Понимаю, что кода много и ,возможно, он лишний, но, лучше больше чем меньше, плюс, чтобы было всё предельно понятно, а именно: что, как и почему.
  • Вопрос задан
  • 187 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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