我正在尝试做一个项目......项目需要从具有联系人的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成员的那种)
答案 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并不是非常有效。无论如何,手写的排序可能不会从一个好的库中击败一个,它只是增加了更多代码来维护。