Я пытаюсь использовать вставки сортировку по односвязному списку, где каждый узел имеет несколько параметров, скажет:Сортировки связанного списка по нескольким параметрам
typedef struct _node {
char param1[10];
char param2[10];
char param3[10];
struct _node *next;
} node;
алгоритм будет сортировать список по param1, а в случае эквивалентных элементов определяют порядок по параметру 2 и аналогично параметру 3. Мне не удалось найти решение этой проблемы в Интернете. Для одного параметра, у меня есть следующая реализация алгоритма сортировки для работы:
void insertionSort(node **head) {
//Initialize sorted list
node *sorted = NULL;
node *current = *head;
//Insert every node into sorted list
while (current != NULL) {
// Store next for next iteration
node *next = current->next;
sortedInsert(&sorted, current);
// Update current
current = next;
}
//Replace old empty list with sorted list
*head = sorted;
}
void sortedInsert(node **head, node *new) {
node *current = *head;
// Special case for the head
if (current == NULL || strcmp(current->param1, new->param1) >= 0) {
new->next = current;
*head = new;
}
else {
while (current->next!=NULL && strcmp(current->next->param1, new->param1) < 0){
current = current->next;
}
new->next = current->next;
current->next = new;
}
}
Моего предположение было бы, что я должен создать функцию сравнения вместо следующих бит, может быть целое число функции, возвращающая 0 или 1 соответствует двум случаям:
current->param1 >= new->param1
current->next->param1 < new->param1
Однако я не могу придумать такую функцию. Может ли кто-нибудь помочь мне с этим?
Обычная процедура, принимает решения о том, что происходит до или после сравнения. Если сравнение выполняется в функции, то по возврату (например, меньше нуля, ноль, больше нуля). Если вы сортируете по основным параметрам и сталкиваетесь с эквивалентностью, сравните свою вторую строку и используйте эти результаты для размещения. В большинстве случаев функция сравнения будет принимать указатель void для каждого сравниваемого узла, поэтому у вас будет доступ к первичной и вторичной строкам внутри функции. Просто включите вторичное сравнение в случае, если результат первого равен нулю. –
FWIW, функции типа сравнения обычно возвращают 0, чтобы указать, что оба аргумента равны, положительное целое число, указывающее, что первый аргумент больше второго, и отрицательное целое число, указывающее, что первый аргумент меньше, чем второй. (Например, это то, что делает 'strcmp'). Я рекомендую либо принять это соглашение, либо выбрать такое имя, как' less_than' (и вернуть 'bool', предоставленный' '). –
ruakh
@ DavidC.Rankin не могли бы вы ответить на свой вопрос, чтобы я мог принять его? – rob