user-0 提问: 结构体排序， 每次按不同元素排列，使用同一个函数，这个语句与参数怎么写？谢谢了

回复:
user: user-1
content: 楼主，这个是否符合你的要求，供参考：#include <stdio.h> #include <string.h> #include<algorithm.h> #include <iostream.h> struct student {     char name[20];     char tel [12]; };  int c;//控制排序规则   void outPut(student ss[]);  int compare(const student a, const student b) { 	if (c == 0)//按照姓名升序排序 	{           return strcmp(a.name,b.name)<0;//strcmp是用来比较两个char型字符串的字典序大小  string.h头文件下 	} 	else if (c == 1)//按照电话降序排序 	{           return strcmp(a.tel,b.tel)>0; 	} }   int main(int argc, char* argv[]) {     student contacts[10] = { {"LiLei"    ,"13678941562"},                              {"WangHao"  ,"15046523182"},                              {"WangDi"   ,"13598741863"},                              {"OuyangDan","13875469871"},                              {"HanLi"    ,"13647152364"},                              {"Zhengchao","15098563214"},                              {"Futong"   ,"13213254698"},                              {"FangYang" ,"15978632132"},                              {"BaiHao"   ,"15432145698"},                              {"Cenyu"    ,"15896566532"} };      printf("姓名按增序排列:\n");     c =0;     sort(contacts,contacts+10,compare);     outPut(contacts);                      printf("电话号码按降序排列：\n");     c =1;     sort(contacts, contacts + 10,compare);     outPut(contacts);          system("pause");     return 0;      }  void outPut(struct student ss[]) {     int i;     printf("          ------通讯录-------\n");     printf("          姓名\t\t\电话\t\t\n");     for (i = 0; i < 10; i++)         printf("%20s\t\%12s\t\n",ss[i].name,ss[i].tel);     printf("\n"); }

user: user-0
content: 如百度到别人写的  stu.cpp : Defines the entry point for the console application.   // #include "stdafx.h" //------------------------------------------指针排序-------------------------------------------------------------------------------   #include<stdio.h> #include<stdlib.h> #include<string.h>   #define N 3   //学生结构体 struct student{ 	long stuNum; //学号 	char name[20];//姓名 	char idCard[18];//身份证 	float score[3];//三门成绩 };   //根据学生姓名排序 void name_sort(student *stu,int n) { 	student temp; 	for(int i=0;i<n-1;i++) 	{ 		for(int j=0;j<n-1-i;j++) 		{ 			if(strcmp(stu[j].name,stu[j+1].name)>0) 			{ 				temp =stu[j+1]; 				stu[j+1]=stu[j]; 				stu[j]=temp;   			} 		} 	}   	printf("\n"); 	printf("*根据学生姓名排序后的学生情况:\n\n");   	for(int i=0;i<N;i++) 	{ 		printf("第 %d 个学生信息:\n学号：%ld\t姓名：%s\t身份证：%s\t语文：%.2f\t数学:%.2f\t英语：%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]);   	} } //根据身份证进行排序 void idCard_sort(student *stu,int n) { 	student temp; 	for(int i=0;i<n-1;i++) 	{ 		for(int j=0;j<n-1-i;j++) 		{ 			if(strcmp(stu[j].idCard,stu[j+1].idCard)>0) 			{ 				temp =stu[j+1]; 				stu[j+1]=stu[j]; 				stu[j]=temp;   			} 		} 	}     	printf("\n"); 	printf("*根据学生身份证排序后的学生情况:\n\n");   	for(int i=0;i<N;i++) 	{ 		printf("第 %d 个学生信息:\n学号：%ld\t姓名：%s\t身份证：%s\t语文：%.2f\t数学:%.2f\t英语：%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]);   	}     }   //根据学号进行排序   void stuNum_sort(student *stu,int n) { 	 	student temp; 	for(int i=0;i<n-1;i++) 	{ 		for(int j=0;j<n-1-i;j++) 		{ 			if(stu[j].stuNum>stu[j+1].stuNum) 			{ 				temp =stu[j+1]; 				stu[j+1]=stu[j]; 				stu[j]=temp;   			} 		} 	}     	printf("\n"); 	printf("*根据学生学号排序后的学生情况:\n\n");   	for(int i=0;i<N;i++) 	{ 		printf("第 %d 个学生信息:\n学号：%ld\t姓名：%s\t身份证：%s\t语文：%.2f\t数学:%.2f\t英语：%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]); 		 	}     }   //main函数   int main() {   	struct student stu[N],*pStu;   	//控制台屏幕变为蓝色背景 	system("color 1f");   	printf("请依次输入学生的学号，姓名，身份证，三门成绩(空格分开)\n"); 	for(int i=0;i<N;i++) 	{ 		printf("输入第 %d 个学生的信息\n",i+1); 		scanf("%ld%s%s%f%f%f",&stu[i].stuNum,stu[i].name,stu[i].idCard,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]); 		 	} 	 	pStu=stu;       	//清屏 	system("cls");     	printf("\n*** 输入1 按照学生学号排序 ***\n*** 输入2 按照学生姓名排序 ***\n*** 输入3 按照学生身份证排序 ***\n*** 输入0 退出 ***\n\n");   	printf("请输入:"); 	int t; 	scanf("%d",&t);   	//循环 	do{ 		//根据用户输入的值选择排序的字段 		switch (t) 		{ 		case 1: 			stuNum_sort(pStu,N);//学号排序 			break; 		case 2: 			name_sort(pStu,N);//姓名排序 			break;   		case 3: 			idCard_sort(pStu,N);//身份证排序 			break;   		default: 			name_sort(pStu,N); 		}     		printf("\n请输入:"); 		scanf("%d",&t);   	}while(t!=0);   	return 1; }             //------------------没有指针--------------------------------------------------------------------------------------------------   // //#include<stdio.h> //#include<stdlib.h> //#include<string.h> // //#define N 5 // 学生结构体 //struct student{ //	long stuNum; //学号 //	char name[20];//姓名 //	char idCard[18];//身份证 //	float score[3];//三门成绩 //}; // // 根据学生姓名排序 //void name_sort(student stu[],int n) //{ //	student temp; //	for(int i=0;i<n-1;i++) //	{ //		for(int j=0;j<n-1-i;j++) //		{ //			if(strcmp(stu[j].name,stu[j+1].name)>0) //			{ //				temp =stu[j+1]; //				stu[j+1]=stu[j]; //				stu[j]=temp; // //			} //		} //	} // // //	printf("\n"); //	printf("*根据学生姓名排序后的学生情况:\n\n"); //	 //	for(int i=0;i<N;i++) //	{ //		printf("第 %d 个学生信息:\n学号：%ld\t姓名：%s\t身份证：%s\t语文：%.2f\t数学:%.2f\t英语：%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]); //		 //	} // // //} 根据身份证进行排序 //void idCard_sort(student stu[],int n) //{ //	student temp; //	for(int i=0;i<n-1;i++) //	{ //		for(int j=0;j<n-1-i;j++) //		{ //			if(strcmp(stu[j].idCard,stu[j+1].idCard)>0) //			{ //				temp =stu[j+1]; //				stu[j+1]=stu[j]; //				stu[j]=temp; // //			} //		} //	} // // //	printf("\n"); //	printf("*根据学生身份证排序后的学生情况:\n\n"); // //	for(int i=0;i<N;i++) //	{ //		printf("第 %d 个学生信息:\n学号：%ld\t姓名：%s\t身份证：%s\t语文：%.2f\t数学:%.2f\t英语：%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]); // //	} // // //} // 根据学号进行排序 // //void stuNum_sort(student stu[],int n) //{ //	student temp; // //	for(int i=0;i<n-1;i++) //	{ //		for(int j=0;j<n-1-i;j++) //		{ //			if(stu[j].stuNum>stu[j+1].stuNum) //			{ //				temp =stu[j+1]; //				stu[j+1]=stu[j]; //				stu[j]=temp; // //			} //		} //	} // // //	printf("\n"); //	printf("*根据学生学号排序后的学生情况:\n\n"); // //	for(int i=0;i<N;i++) //	{ //		printf("第 %d 个学生信息:\n学号：%ld\t姓名：%s\t身份证：%s\t语文：%.2f\t数学:%.2f\t英语：%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]); // //	} // // //} // main函数 // //int main() //{ // //	struct student stu[N]; //	 //	//控制台屏幕变为蓝色背景 //	system("color 1f"); // //	printf("请依次输入学生的学号，姓名，身份证，三门成绩(空格分开)\n"); //	for(int i=0;i<N;i++) //	{ //		printf("输入第 %d 个学生的信息\n",i+1); //		scanf("%ld%s%s%f%f%f",&stu[i].stuNum,stu[i].name,stu[i].idCard,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]); // //	} // //	//清屏 //	system("cls"); //	 //	 //	//printf("*你所输入的学生信息情况:\n"); //	//for(i=0;i<N;i++) //	//{ //	//	printf("第 %d 个学生信息:\n学号：%ld\t姓名：%s\t身份证：%s\t语文：%.2f\t数学:%.2f\t英语：%.2f\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]); //	// //	//} //	 // //	printf("\n*** 输入1 按照学生学号排序 ***\n*** 输入2 按照学生姓名排序 ***\n*** 输入3 按照学生身份证排序 ***\n*** 输入0 退出 ***\n\n"); //	 //	printf("请输入:"); //	int t; //	scanf("%d",&t); //	 //	//循环 //	do{ //		//根据用户输入的值选择排序的字段 //		switch (t) //		{ //		case 1: //				stuNum_sort(stu,N);//学号排序 //				break; //		case 2: //				name_sort(stu,N);//姓名排序 //				break; //				 //		case 3: //				idCard_sort(stu,N);//身份证排序 //				break; //			 //		default: //			name_sort(stu,N); //		} // // //		printf("\n请输入:"); //		scanf("%d",&t); // //	}while(t!=0); // // //	return 1; //}      再次说明下 ，，我不想 	stuNum_sort(pStu,N);//学号排序 			 			name_sort(pStu,N);//姓名排序 			 			idCard_sort(pStu,N);//身份证排序  这三个分开写，意思写成一个函数即可

user: user-2
content: #include "stdio.h" #include "string.h" struct student {     char name[20];     char tel[12]; }; //void sort(student ss[]); void sort(struct student ss[], int (*cmp)(const student *, const student *)); void outPut(student ss[]);   static int cmp_as_name(const student *a1, const student *b1); static int cmp_as_tel(const student *a1, const student *b1); int main() {     student contacts[10] = { {"LiLei","13678941562"},         {"WangHao","15046523182"},         {"WangDi","13598741863"},         {"OuyangDan","13875469871"},         {"HanLi","13647152364"},         {"Zhengchao","15098563214"},         {"Futong","13213254698"},         {"FangYang","15978632132"},         {"BaiHao","15432145698"},         {"Cenyu","15896566532"} };     sort(contacts, cmp_as_name);     outPut(contacts);     sort(contacts, cmp_as_tel);     outPut(contacts);     return 0; }  static int cmp_as_name(const student *a1, const student *b1) {     return strcmp(a1->name, b1->name); }  static int cmp_as_tel(const student *a1, const student *b1) {     return strcmp(a1->tel, b1->tel); }  //void sort(struct student ss[]) void sort(struct student ss[], int (*cmp)(const student *, const student *)) {     int i,j;     student temp;     for (i = 0; i < 10 - 1; ++i)         for (j = i + 1; j < 10; ++j)         {             //if (ss[i].name[0] >= ss[j].name[0]) {             if (cmp(&ss[i], &ss[j]) > 0) {                 temp = ss[i];                 ss[i] = ss[j];                 ss[j] = temp;             }         } }   void outPut(struct student ss[]) {     int i;     printf("------通讯录-------\n");     printf("姓名\t\t电话\t\n");     for (i = 0; i < 10; i++)         printf("%s\t\t%s\t\n",ss[i].name,ss[i].tel);     printf("\n"); }   供参考~  用函数指针吧