我需要一个代码,使用bubblesort算法按名称或年龄按升序对结构数组进行排序。
我阅读了所有元素,我理解了排序的一部分。问题是我应该只声明一个bubblesort算法,以便能够根据名称或年龄进行排序。当两个名字或年龄相同时,我应该比较不同的元素。为此,我应该使用函数指针。我刚开始使用函数指针,我在这里看不到任何出路。非常感谢一点帮助。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct person {
char name [30];
int age;
};
void bubblesort(struct person *prs, int n)
{
struct person temp;
int i, j , a,b;
for(i=0;i<n; i++)
{
for(j=0; j <n-1; j++)
{
a=strcmp(prs[j].name, prs[j+1].name);
b=prs[j+1].age - prs[j].age;
if(a>0)
{
temp=prs[j];
prs[j]=prs[j+1];
prs[j+1]=temp;
}
else if(a==0 && b<0)
{
temp=prs[j];
prs[j]=prs[j+1];
prs[j+1]=temp;
}
}
}
}
int main()
{
int n, i;
struct person *prs;
scanf("%d", &n);
getchar();
prs=(struct person *)malloc(sizeof(struct person)*n);
for(i=0;i<n;i++)
{
fgets(prs[i].name, 30, stdin);
prs[i].name[strlen(prs[i].name)-1]='\0';
scanf("%d", &prs[i].age);
getchar();
}
bubblesort(prs,n);
for(i=0;i<n;i++)
{
printf("{%s, %d};", prs[i].name, prs[i].age);
}
return 0;
}
答案 0 :(得分:1)
您可以使用与标准C函数qsort
使用的方法类似的方法。
向函数bubble_sort
添加第三个参数。例如
void bubble_sort( struct person *p,
int n,
int comp( const struct person *p1, const struct person *p2 ) );
虽然将函数的第二个参数声明为类型size_t
void bubble_sort( struct person *p,
size_t n,
int comp( const struct person *p1, const struct person *p2 ) );
然后定义两个比较struct person
类型对象的函数。如果第一项小于第二项,则每个函数必须返回负值,如果第一项大于第二项,则返回正值,否则返回零。
功能看起来像
int comp_by_name( const struct person *p1, const struct person *p2 )
{
int str_cmp = strcmp( p1->name, p2->name );
int int_cmp = ( p2->age < p1->age ) - ( p1->age < p2->age );
return str_cmp != 0 ? str_cmp : int_cmp;
}
int comp_by_age( const struct person *p1, const struct person *p2 )
{
int str_cmp = strcmp( p1->name, p2->name );
int int_cmp = ( p2->age < p1->age ) - ( p1->age < p2->age );
return int_cmp != 0 ? int_cmp : str_cmp;
}
在bubble_sort
内写下以下if语句
if ( comp( &prs[j+1], &prs[j] ) < 0 )
{
struct person tmp = prs[j+1];
prs[j+1] = prs[j];
prs[j] = tmp;
}
最后调用函数bubble_sort
或者
bubble_sort( prs, n, comp_by_name );
如果要按名称或
对数组进行排序bubble_sort( prs, n, comp_by_age );
如果你想按年龄排序数组。
答案 1 :(得分:0)
将此函数原型用于bubblesort:
void bubblesort(struct person *prs, int n, int (*cmp)(struct person *a, struct person *b)) {...}
现在创建一个比较函数来比较两个人:
int cmpTwoPersons(struct person *a, struct person *b) {...}
如果a> b,此函数应返回大于0的数字,如果a,则小于0
使用此比较功能调用您的bubblesort:
bubblesort(prs, n, cmpTwoPersons);
现在你在bubblesort中使用cmp
:
void bubblesort(...) {
...
int cmpResult = cmp(prs[j], prs[j+1]);
if (cmpResult > 0) {
// j is large than j+1
} else {
// j is smaller than or equal to j+1
}
...
}
答案 2 :(得分:0)
您的冒泡分类签名可以是:
void bubblesort(void **prs, int n, int (*cmp)(void *p1, void *p2))
您现在在冒泡排序中进行比较:
int cmpResult = cmp(prs[j], prs[j+1]);
比较例程的签名是:
int cmpTwoPersons(struct person *a, struct person *b);
并将冒泡排序称为:
bubblesort(prs, n, cmpTwoPersons);
通过使用void *
作为数据类型,您可以使冒泡排序算法与要排序的数据相关,并且比较函数说明如何比较两个元素。但是,要排序的数据必须是一个指针数组,因此气泡只需要交换指针而不是整个结构,因为它不知道它们的大小。