2013-07-05 6 views
0

Я пытаюсь сортировать линейный связанный список по фамилии, однако он сбой, также я не знаю, работает ли мой алгоритм правильно.Как отсортировать связанный список

Может кто-нибудь помочь мне остановить его от сбоя и посмотреть, работает ли мой алгоритм сортировки списка?

void sort(NODEPTR *employees, int maxEmployees) 
{ 
    int i = 0, j = 0, k = 0; 
    NODEPTR p, q, pTrail = NULL, qTrail, temp; 
    temp = (NODEPTR) calloc(1, sizeof(node)); 

    qTrail = *employees; 
    q = (*employees)->next; 
    for (i = 0; i < maxEmployees; i++) 
    { 

    p = *employees; 

    while (p != q) 
    { 

     if (strcmp(p->lastName, q->lastName)) 
     { 
     temp = q; 
     qTrail = q->next; 
     q = pTrail->next; 

     temp = pTrail->next; 
     pTrail = temp; 

     p = q; 
     } 
     else 
     { 
     pTrail = p; 
     p = p->next; 
     } 

    } 
    qTrail = q; 
    q = q->next; 

    pTrail = NULL; 
    } 
    printf("%10s %10ss\n", "First", "Last"); 
    printf("%10s %10s\n", "-----", "----"); 

    for (i = 0; i < maxEmployees; i++) 
    { 
    printf("%10s %10ss\n", (*employees)->firstName, (*employees)->lastName); 
    } 
} 

Связанный список:

typedef struct node 
{ 
    char firstName[11]; 
    char lastName[16]; 
    char gender; 
    int tenure; 
    char rate; 
    float salary; 
    struct node *next; 
} node, *NODEPTR; 
+5

Вместо переключения целых узлов с местами вы должны переключать только их содержимое и оставить привязку нетронутой. Также было бы неплохо узнать, какова ваша ошибка при сбое. –

+1

@AlexandruBarbarosie Но если узлы большие, то это превратит программу невероятно медленно ... – Lundin

+0

@ Lundin хорошо, да, но в его случае это не так уж и много. Кроме того, ему не хватает OP от любых утечек памяти. –

ответ

2

Ваша логика, кажется, неправильно:

strcmp() вернется три значения.

  • 1, если значение первого аргумента>
  • -1, если значение второго аргумента является>
  • 0 если значение оба аргумента являются одинаковыми.

Так на основе strcmp(p->lastName,q->lastName) вы не можете сортировать.

Вы должны изменить позицию только тогда, когда strcmp() возвращает 1. для -1 и 0 он должен идти в else часть.

+0

Итак, сделайте это 'if (strcmp (p-> lastName, q-> lastName) == 1)' ??? –

+1

Нет, никогда, никогда, не делайте предположение (скорее неверное) о том, что 'strcmp' возвращает только значения' -1', '0' или' 1'. Это абсолютно стандартно подходит для 'strcmp (" a "," c ")' для возврата '-2'. – Vatine

+0

Что еще более важно, он идеально подходит для 'strcmp (" a "," c ")' для возврата '-97' (или' -9000'). _only_ гарантирует, что у вас есть о возвращаемом значении, это то, что это 'int', что он будет равен нулю, если две строки будут идентичны, что это будет отличным от нуля, если две строки различаются в любом отношении и что ..." Знак ненулевого возвращаемого значения определяется знаком разницы между значениями первой пары байтов (оба интерпретируются как неподписанные символы типа), которые различаются в сравнении строк. ". –

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