Всем доброго времени суток. Пишу программу "Домашняя кинотека" с использованием графического интерфейса. Имеется структура, которая содержит в себе данные о фильме (название, год производства, страну производства, режиссёра и т.д.).
Задание таково: Пользователь пишет имя режиссёра, и ему выдаётся таблица с фильмами этого режиссёра со списком фильмов, отсортированные по названию фильма. Сделал лишь только так, чтобы выдавал нужного режиссёра, с сортировкой разобраться не могу. За помощь буду признателен, часть программы (сама структура, создание, добавление элемента прилагаю).
// Структура для описания фильма из кинотеки
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();
}
Понимаю, что кода много и ,возможно, он лишний, но, лучше больше чем меньше, плюс, чтобы было всё предельно понятно, а именно: что, как и почему.