结构排序与不同的成员

时间:2017-05-13 17:47:25

标签: c sorting struct members

我正在尝试做一个项目......项目需要从具有联系人的csv文件中读取。 联系人有几个字段,我读到一个类型联系的结构数组。 例如:array.contactFirstName,数组contactLastName等。 以下是代码的一部分:

void string_InsertionSort(contact *array, int size, char *sortField){
    waitForKey();
    int i,j;
    contact key;
    if (strcmp(sortField, "First name") == 0){

        for (i = 1; i < size; i++){
            key=array[i];   
            j = i-1;                
            while ( (j >= 0) && strcmp(array[j].contactFirstName, array[j].contactFirstName) > 0){

                    array[j + 1] = array[j];
                    j--;    
                }
                array[j + 1] = key; 
            }

    }else if (strcmp(sortField, "Last name") == 0){

        for (i = 1; i < size; i++){
            key=array[i];
            j= i-1;
            while ( (j >= 0) && strcmp(array[j].contactLastName, array[j].contactLastName) > 0){
                array[j + 1] = array[j];
                j--;
            }
            array[j + 1] = key; 
        }

    }else{

        printf(" debuggggg");
    }
}

我正在实现几个排序算法,以便在几个不同的函数中对联系人进行排序。

我遇到的问题是,在string_InsertionSort函数中,我传递了一个联系人数组,数组的大小以及我想要排序的排序字段。在函数内部,我将排序字段与我拥有的字段进行比较,如果是正确的字段,我进行排序。

问题是我有15个不同的字段,所以我必须重复所有代码到不同的fiels。还有另外一种方法吗?如果是这样,任何人都能让我成为一个例子吗? (从外面访问struct成员的那种)

1 个答案:

答案 0 :(得分:0)

这通常通过传入一个函数指针来进行比较来解决,就像在qsort中一样。

 void
 qsort(void *base, size_t nel, size_t width,
     int (*compar)(const void *, const void *));

int (*compar)(const void *, const void *)表示传入一个带有两个void指针并返回整数的函数指针。这允许通用排序功能,可以按照您喜欢的方式对任何内容进行排序,但您必须编写比较。

在您的代码中,按名称排序的函数可能类似于:

int cmp_contact_names( const void *_a, const void *_b ) {
    // Copy the void pointers to their correct types.
    // Easier to work with than casting multiple times.
    const contact *a = _a;
    const contact *b = _b;

    // Sort by last name, then by first name.
    return strcmp( a->contactLastName, b->contactLastName ) ||
           strcmp( a->contactFirstName, b->contactFirstName );
}

然后传递给qsort。要排序的列表,列表中的元素数量,每个元素的大小以及用于排序的比较函数。

qsort(contacts, num_contacts, sizeof(contact*), cmp_contact_names);

在此之后设置插入排序,或者在qsort_r之后更好。

除非这是一个练习,否则编写自己的插入排序没有意义,请使用库中的现有插入排序。或者使用更好的排序,insertion sort并不是非常有效。无论如何,手写的排序可能不会从一个好的库中击败一个,它只是增加了更多代码来维护。