函数指针实现的动态排序

承接上一篇函数指针的介绍

函数指针和回调函数详解_星空_MAX的博客-CSDN博客

这一篇将给出实际应用

一般的做法

实现了一个学生表按照三种方式排列的方式,原版三种排序写了三遍排序,代码冗余极大

#include<stdio.h>
#include<cstring>

int Num;

struct Student  //学生结构体
{
	char name[50];
	int age;
	float score;
};

struct Class  //班级结构体
{
	int Num;
	Student *AllStudents;
};

void SwapStudent(Student &a,Student &b) //交换学生在表中得位置
{
	Student Temp;
	Temp=a;
	a=b;
	b=Temp;
}

void PrintfAllStudents(const Class a) //打印所有学生清单
{
	printf("=======================\n");	
	for (int i = 0; i < a.Num; ++i)
	{    
        printf("%s   %d  %.2f\n",a.AllStudents[i].name,a.AllStudents[i].age,a.AllStudents[i].score);
    };	
	printf("\n=======================\n");
}

void SortByAge(Class &AllList) //按照年龄排序
{
	for(int i=0;i<AllList.Num-1;++i)
		for(int j=0;j<AllList.Num-1-i;++j)
		{
			if(AllList.AllStudents[j].age>AllList.AllStudents[j+1].age)
			{
				SwapStudent(AllList.AllStudents[j],AllList.AllStudents[j+1]);	
			}	
		}
}

void SortByScore(Class &AllList) //按照分数排序
{
	for(int i=0;i<AllList.Num-1;++i)
		for(int j=0;j<AllList.Num-1-i;++j)
		{
			if(AllList.AllStudents[j].score>AllList.AllStudents[j+1].score)
			{
				SwapStudent(AllList.AllStudents[j],AllList.AllStudents[j+1]);
			}	
		}
}

void SortByName(Class &AllList) //按照名字排序
{
	for(int i=0;i<AllList.Num-1;++i)
		for(int j=0;j<AllList.Num-1-i;++j)
		{
			if(strcmp(AllList.AllStudents[j].name,AllList.AllStudents[j+1].name)==1)
			{
				SwapStudent(AllList.AllStudents[j],AllList.AllStudents[j+1]);
			}	
		}
}



int main()
{
	Class classOne;
	classOne.Num=6; 
	Student List[]=
	{
       	{"zhangsan",15,17.6},
        {"lisi",12,20.6},
        {"wangwu",16,13.7},
        {"zhaoliu",18,15.6},
        {"sunqi",18,15.6},
        {"zhouba",18,15.6}
    };
	classOne.AllStudents=List;	
	SortByName(classOne);  //按姓名排序
	PrintfAllStudents(classOne); //将排序好的名单打印出来
		
}

使用函数指针动态优化后

#include<stdio.h>
#include<cstring>

int Num;

struct Student  //学生结构体
{
	char name[50];
	int age;
	float score;
};

struct Class  //班级结构体
{
	int Num;
	Student *AllStudents;
};

void SwapStudent(Student &a,Student &b) //交换学生在表中得位置
{
	Student Temp;
	Temp=a;
	a=b;
	b=Temp;
}

void PrintfAllStudents(const Class a) //打印所有学生清单
{
	printf("=======================\n");	
	for (int i = 0; i < a.Num; ++i)
	{    
        printf("%s   %d  %.2f\n",a.AllStudents[i].name,a.AllStudents[i].age,a.AllStudents[i].score);
    };	
	printf("\n=======================\n");
}


bool SortByAge(Student s1,Student s2)
{
	return s1.age<s2.age;
}

bool SortByScore(Student s1,Student s2)
{
	return s1.score<s2.score;
}

bool SortByName(Student s1,Student s2)
{
	return strcmp(s1.name,s2.name)==1;
}




void Sort(Class &AllList,bool (*sortFunction)(Student s1,Student s2)) //根据传来的指针方法进行排序
{
	for(int i=0;i<AllList.Num-1;++i)
	{
		for(int j=0;j<AllList.Num-1-i;++j)
		{
			if(sortFunction(AllList.AllStudents[j],AllList.AllStudents[j+1]))
			{
				SwapStudent(AllList.AllStudents[j],AllList.AllStudents[j+1]);	
			}	
		}
	}

}

int main()
{
	Class classOne;
	classOne.Num=6; 
	Student List[]=
	{
       	{"zhangsan",15,17.6},
        {"lisi",12,20.6},
        {"wangwu",16,13.7},
        {"zhaoliu",22,15.6},
        {"sunqi",19,15.6},
        {"zhouba",17,15.6}
    };
	classOne.AllStudents=List;	
	Sort(classOne,SortByAge);//选择按年龄排序
	PrintfAllStudents(classOne);
		
}

其中

void Sort(Class &AllList,bool (*sortFunction)(Student s1,Student s2))

可用typedef替换为


typedef bool(*SORT)(Student s1,Student s2);
void Sort(Class &AllList,SORT sortFunction) 

在上面,直接传入比较方法指针,就可以减少大量代码冗余

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值