Двоичный поиск в списке

Мне нужно написать двоичный поиск по ключу(первые 3 буквы фио - вводится с клавиатуры) в отсортированном списке и из подходящих значений создать новый список. У меня есть поиск который находит один ключ, но как сделать так чтобы он и дальше продолжил искать подходящие результаты. Если допустим мой ключ это серединный элемент я его найду сразу, а дальше... что если предыдущий элемент тоже мне подходит, а список то односвязный и дойти до предыдущего элемента только сначала. И я думаю сделать список двусвязным может это упростит отчасти задачу, но тогда наверное можно и фукцию улучшить. Вот хочу поинтересоваться может кто подскажет идею. Спасибо

struct lister // spisok
{
    lister* next;
    human* data;
} *head, * tail;

lister* middle(lister* start, lister* last)
{
    if (start == NULL)
        return NULL;
    lister* slow = start;
    lister* fast = start->next;

    while (fast != last)
    {
        fast = fast->next;
        if (fast != last)
        {
            slow = slow->next;
            fast = fast->next;
        }
    }
    return slow;
}

//к = первые три буквы ФАМИЛИИ
lister* search(lister **head, char* key) {
    lister* start = *head;
    lister* last = NULL;
    do
    {
        lister* mid = middle(start, last);
        if (mid == NULL)
            return NULL;
        int i = strNcmp(mid->data->name, key, 3);
        if (i == 0) // nasрli i nado ego obavit' v novii spisok
        {
            return mid;
        }
        else if (i < 0) // If value is more than mid
            start = mid->next;
        else // If the value is less than mid
            last = mid;
    } while (last != NULL || last != start);
    // value not present
    return NULL;
}


Ответы (1 шт):

Автор решения: Zhihar

а что мешает в лоб - сформировать этот ФИО и сравнить через функции работы со строками?

char fio1[4] = {0};
fio1[0] = obj1->data->family[0];
fio1[1] = obj1->data->name[0];
fio1[2] = obj1->data->second_name[0];

char fio2[4] = {0};
fio2[0] = obj2->data->family[0];
fio2[1] = obj2->data->name[0];
fio2[2] = obj2->data->second_name[0];

if (strcmp(fio1, fio2) < 0) {}
→ Ссылка