承接上一篇函数指针的介绍
这一篇将给出实际应用
一般的做法
实现了一个学生表按照三种方式排列的方式,原版三种排序写了三遍排序,代码冗余极大
#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)
在上面,直接传入比较方法指针,就可以减少大量代码冗余