gpt4 book ai didi

c - 不同成员的结构排序

转载 作者:太空宇宙 更新时间:2023-11-04 04:23:26 25 4
gpt4 key购买 nike

我正在尝试做一个项目...该项目需要从具有联系人的 csv 文件中读取。联系人有几个字段,我将其读取为联系人类型的结构数组。例如:array.contactFirstName、array 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 个不同的字段,所以我必须对不同的字段重复所有代码。还有别的办法吗?如果是这样,任何人都可以让我举个例子吗? (类从外部访问结构成员)

最佳答案

这通常是通过传入一个函数指针来进行比较来解决的,就像在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效率不是很高。无论如何,手写排序可能无法胜过优秀库中的排序,它只是增加了更多需要维护的代码。

关于c - 不同成员的结构排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43956188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com