2013-10-13 1 views
-2

Это немного из Doozy проблемы кодирования мне нужна помощь по - используется первый структуры:QSort сортировать массив структур, что указывает на другой структуры

typedef struct node { 
    char email[100]; 
} Node; 

typedef struct edge { 
    Node *from_email, *to_email; 
} Edge; 

Node nodes[NODE_ARRAY_SIZE]; 
Edge edges[EDGE_ARRAY_SIZE]; 

Итак, как вы можете см. структуру «Узла» содержит массив символов с электронной почтой, а структура «Край» содержит указатели на 2 разных Узла. Есть также два массива, один из узлов и один из Edges.

Я хотел бы QSort() как массивы - Я уже сделал узлы один, используя:

qsort(nodes, node_size, sizeof(Node), node_cmp_function); 
int node_cmp_function(const void *a, const void *b) { 
    Node *temp_a = (Node *)a; 
    Node *temp_b = (Node *)b; 
    return strcmp(temp_a->username, temp_b->username); 
} 

, но я не могу понять, как сортировать массив Edges -> Я хотел бы отсортировать его используя strcmp on * from_email - но если оба * from_emails сравниваются, то я хотел бы сортировать, используя * to_email.

Спасибо за помощь!

+0

что вы пробовали? вы, похоже, хорошо понимаете, что вам нужно сделать - напишите функцию qsort, которая принимает ребра, сравните значение from_email, если это получится равным, сравните to_email. – NiRR

ответ

0

Если я правильно, что вы делаете понять, что-то подобное может работать (непроверенный код):

int edge_cmp_function(const void *a, const void *b) 
{ 
    Edge *temp_a = (Edge *)a; 
    Edge *temp_b = (Edge *)b; 
    int result = 0; 

    if ((result = node_cmp_function(temp_a->from_email, temp_b->from_email)) == 0) 
    { 
     result = node_cmp_function(temp_a->to_email, temp_b->to_email); 
    } 

    return result; 
} 
+1

Боковое примечание: '' (void *) 'casts не нужны. –

+0

Ahhh, работает как шарм! Я пытался использовать сравнение указателей, но это было глупо - я не могу поверить, что решение было прямо там. Еще раз спасибо! –

+0

Добро пожаловать! Спасибо за внимание, Мартин Р. Я обновил код, чтобы вытащить чрезмерно явные приведения! – Baldrick