@alexxelo

Сортировка слиянием по нескольким условиям?

6135016c0aa7b054051523.jpegМне нужно сортировкой слиянием по имени и по сумме отсортировать элементы базы данных. Когда сортирую только по имени или только по сумме всё отлично выходит, но совместно эти условия не дают нужного результата. Элементы меняют свой порядок но не полностью как нужно. Что не так не могу понять. Хочу получить все имена по алфавиту на меньшую сумму и так далее на остальные до конца, а сейчас я получаю то что на изображение
struct human // ya4eika dlya bazi
{
    char name[32] = { 0 };
    unsigned short int number;
    char date[8] = { 0 };
    char lawyer[22] = { 0 };
} *stacks;
struct lister // spisok
{
    lister* next;
    human* data;
} *head, * tail;
int compUsers(lister* first, lister* second)
{
    int nameCompareResult = strcmp(first->data->name, second->data->name);
    if (nameCompareResult)
        return nameCompareResult;
    else
        return first->data->number - second->data->number;
}
lister* mergeSortedList(lister* stl1, lister* stl2) 
{
    lister* result = NULL;
    if (stl1 == NULL)
        return stl2;
    if (stl2 == NULL)
        return stl1;
    int num = strncmp(stl1->data->name, stl2->data->name, 3);
    //recursing merging 2 lists
    if (compUsers(stl1, stl2) < 0) //(stl1->data->number <= stl2->data->number)//(num <= 0)
    {
        result = stl1;
        result->next = mergeSortedList(stl1->next, stl2);
    }
    else
    {
        result = stl2;
        result->next = mergeSortedList(stl1, stl2->next);
    }
    return result;

}
void mergeS(lister** thead)
{
    lister* head = *thead;
    lister* ptr1;
    lister* ptr2;
    if (head == NULL || head->next == NULL)
        return;
    splitList(head, &ptr1, &ptr2);
    //recursively sorting 2 lists
    mergeS(&ptr1);
    mergeS(&ptr2);
    *thead = mergeSortedList(ptr1, ptr2);
}
  • Вопрос задан
  • 100 просмотров
Решения вопроса 1
@alexxelo Автор вопроса
int compUsers(lister* first, lister* second)
{
if (first->data->number != second->data->number)
return first->data->number - second->data->number;
return strcmp(first->data->name, second->data->name);
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы