2015-11-16 2 views
0

Я пытаюсь использовать вставки сортировку по односвязному списку, где каждый узел имеет несколько параметров, скажет:Сортировки связанного списка по нескольким параметрам

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 

Однако я не могу придумать такую ​​функцию. Может ли кто-нибудь помочь мне с этим?

+2

Обычная процедура, принимает решения о том, что происходит до или после сравнения. Если сравнение выполняется в функции, то по возврату (например, меньше нуля, ноль, больше нуля). Если вы сортируете по основным параметрам и сталкиваетесь с эквивалентностью, сравните свою вторую строку и используйте эти результаты для размещения. В большинстве случаев функция сравнения будет принимать указатель void для каждого сравниваемого узла, поэтому у вас будет доступ к первичной и вторичной строкам внутри функции. Просто включите вторичное сравнение в случае, если результат первого равен нулю. –

+1

FWIW, функции типа сравнения обычно возвращают 0, чтобы указать, что оба аргумента равны, положительное целое число, указывающее, что первый аргумент больше второго, и отрицательное целое число, указывающее, что первый аргумент меньше, чем второй. (Например, это то, что делает 'strcmp'). Я рекомендую либо принять это соглашение, либо выбрать такое имя, как' less_than' (и вернуть 'bool', предоставленный' '). – ruakh

+0

@ DavidC.Rankin не могли бы вы ответить на свой вопрос, чтобы я мог принять его? – rob

ответ

0

Обычная процедура, принимает решения о том, что происходит до или после сравнения. Если сравнение выполняется в функции, то порядок элементов определяется возвратом (например, меньше нуля (обычно -1), ноль, больше нуля (обычно это возврат 1)).

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

Смежные вопросы