Angel Chan Ответов: 3

Как отфильтровать двусвязный список?


Я пытаюсь искать репетиторов по общей производительности или рейтингу. Это означает, что он будет возвращать несколько значений. Но я получил только 1 значение. Как я могу получить код, чтобы вернуть несколько репетиторов вместо только 1, даже если их несколько репетиторов с одинаковым рейтингом.

Что я уже пробовал:

функция поиска:
cout << "Enter Rating:" << endl;
		cin >> rating;
		while (current != NULL)
		{
			if (current->rating == rating) 
			{
				cout << "Tutor ID:" << current->tutorID << endl;
				cout << "Tutor Name:" << current->tutorName << endl;
				cout << "Date Joined:" << current->day_join << "/" << current->month_join << "/" << current->year_join << endl;
				cout << "Date Terminated:" << current->day_ter << "/" << current->month_ter << "/" << current->year_ter << endl;
				cout << "Hourly Pay Rate:" << current->hourly_pay_rate << endl;
				cout << "Phone:" << current->phone << endl;
				cout << "Address:" << current->address << endl;
				cout << "Center Code:" << current->centerCode << endl;
				cout << "Center Name:" << current->centerName << endl;
				cout << "Subject Code:" << current->subjectCode << endl;
				cout << "Subject Name:" << current->subjectName << endl;
				cout << "Rating:" << current->rating << endl;


				flag = 1; /*tutor details found*/
				break;
			}
			current = current->next; /*move to one node to another*/

		}
		if (flag == 0) /*if still no match found*/
			cout << "Not found" << endl;
struct Node 
{
	int tutorID;
	string tutorName;
	int day_join;
	int month_join;
	int year_join;
	int day_ter;
	int month_ter;
	int year_ter;
	int hourly_pay_rate;
	int phone;
	string address;
	int centerCode;
	string centerName;
	int subjectCode;
	string subjectName;
	int rating;
	struct Node* prev;
	struct Node* next;
};

3 Ответов

Рейтинг:
1

k5054

У тебя есть:

while(current != NULL)
{
    if (current->rating == rating)
    {
        // display details ...
        
        flag = 1;
        break;    // <== !!!
     }
     // etc
}

То break в while цикл завершает цикл, поэтому вы получаете только первый соответствующий элемент. Вы, вероятно, хотите удалить это.

Почему бы не использовать контейнер STL например std::list или std::vector, тогда использовать std::copy_if чтобы создать новый контейнер с соответствующими элементами в нем?


Рейтинг:
1

steveb

Пожалуйста, ознакомьтесь со стандартными библиотечными алгоритмами. Он обрабатывает многие академические и обычные предметы реальной жизни, такие как ваш


Рейтинг:
0

OriginalGriff

Вам нужно будет создать новую коллекцию, содержащую указатели на "найденные узлы".
Вы не можете изменить узел "следующая" или "предыдущая" ссылки, или вы разорвете существующий связанный список.

Ваша коллекция может быть массивом или списком новой структуры, содержащей указатель узла и указатель "next", чтобы его можно было повторять.