Используя C++ и не используя функции контейнеров STL, я пытаюсь скопировать значения из одной структуры в другую определенным образом.
У меня есть такая структура (односвязный список), и вот как я добавляю в нее новые элементы:
struct Node {
Node *next;
std::string name;
std::string surname;
};
void AddElement(Node *&head, const std::string &name, const std::string &surname)
{
head = new Node {head, name, surname};
}
Пример использования:
Node *pointer = nullptr;
AddElement(pointer, "Alex", "Smith");
AddElement(pointer, "Robert", "Johnson");
AddElement(pointer, "George", "Smith");
AddElement(pointer, "Oscar", "Williams");
У меня также есть другая структура:
struct Result {
Result *next;
std::string surname;
};
Я хочу скопировать все значения «фамилии» из первого списка узлов в новый список результатов только один раз для каждого заданного значения «фамилии».
То есть, если у меня есть в моем связанном списке узлов такие фамилии: "Smith", "Johnson", "Smith", "Johnson", "Williams"
, я хочу, чтобы "Smith", "Johnson", "Williams"
был в моем списке результатов.
Я новичок в C++, указателях и структурах. Как мне подойти к этому?
Извините, я имел в виду функции контейнеров STL.
это означает отсутствие std::set
?
Ага, точно. Нельзя использовать std :: set, std :: vector и т. д. И их методы.
Что ж, способ «грубой силы» - это перебрать ваш исходный список и по каждому пункту спросить себя, добавляли ли вы эту фамилию раньше. Определение того, добавили ли вы фамилию перед тем, как пройти по списку результатов. Таким образом, вы получите один цикл внутри другого. Это некрасиво, но это самый простой подход.
Просто любопытно: почему нельзя использовать контейнеры std? Цель упражнения? Требование учителя? Недостаточно места во встроенной системе? ...?
Вот возможный алгоритм сокращения поиска без изменения основных определений структур:
Сохраняйте список структур результатов в алфавитном порядке. Всякий раз, когда вы проверяете фамилию, ищите в структурах результатов, пока вы не: (1) Найдите точное совпадение и не добавляйте его (2) Найдите фамилию в алфавитном порядке после той, которую вы ищете. В этом случае добавьте новую фамилию непосредственно перед найденной.
Возможно, это не лучшее или единственное решение, но я предлагаю его как направление.
Я не использую стандартные библиотеки. Что же тогда
std::string
?