31.姓名排序 创建一个长度为size的动态指针数组,然后从键盘读取size个学生的名字存储到字符数组中,字符数组首元素地址存储到指针数组元素中。 #include<stdio.h> #include<stdlib.h> #define N 20 /*创建一个长度为size的动态指针数组,然后从键盘读取size个 学生的名字存储到字符数组中,字符数组首元素地址存储到指针数组元素中。*/ char ** inputName(int); void sort(char *[], int); //函数功能:对字符串进行排序。 void printName(char *[], int); //函数功能:依次输出指针数组元素所指向的字符串。array指向的数组元素。 void freeName(char * [],int); //函数功能:释放本程序中动态申请的内存。 main() { int size; //size表示要排序的人数 char **array; printf("请输入要排序的人数:\n"); scanf("%d",&size); printf("请输入%d个学生的名字,每输入一个用回车键结束:\n",size); //从键盘读取size个学生的名字存储在字符数组中 array=inputName(size); //对字符串进行排序 sort(array,size); printf("从小到大,这%d个学生的姓名为:",size); //打印出size个学生的名字 printName(array,size); system("pause"); //释放动态数组的内存空间 freeName(array,size); system("pause"); return 0; } /*创建一个长度为size的动态指针数组,然后从键盘读取size个 学生的名字存储到字符数组中,字符数组首元素地址存储到指针数组元素中。*/ char **inputName(int size) { int inputch(char [],int); //读取字符串并返回其长度 char ** array; char string[N]; //将读取的字符串暂时存储在string数组中 int i,length; //申请动态指针数组的内存空间 array=(char **)malloc(sizeof(char*)*size); if(array!=NULL){ for(i=0;i<=size;i++){ length=inputch(string,N); //读取字符串 *(array+i)=(char *)malloc(sizeof(char*)*length); if(*(array+i)!=NULL) strcpy(*(array+i),string); //将字符串string中的字符拷贝到*(array+i)中 } } return array; //返回动态指针数组的首地址 } //函数功能:对字符串进行排序。 void sort(char *a[], int size) { int strCmp(char*,char*); //比较两个字符串的大小 char *tempPtr; int i,j,min; /*使用选择法排序, 外循环每循环一次,确定name[i]的值*/ for(i=0; i<= size-1; i++){ /*外循环:确定a[i]的值*/ /*从a[i]~a[size-1]所指向的串中选出最小串,由a[min]指向*/ min=i; for(j=i+1; j<=size; j++) if(strCmp(a[min], a[j])>0) /*存在更小的串*/ min=j; /*交换a[min]和a[i],使a[i]指向a[i]~a[size-1]所指向的串中的最小串*/ if(min!=i){ tempPtr= a[i]; a[i]= a[min]; a[min]=tempPtr; } } } /*s指向的串大于t指向的串,返回1;小于,返回-1;等于,返回0*/ int strCmp(char * s,char * t) { while(*s!='\0' && *t!='\0' && *s==*t){ s++; t++; } if(*s==*t) //若结束比较时s和t所指字符相等,则肯定指向‘\ return 0; else if(*s>*t)//任何一个字符均大于‘\ return 1; else return -1; } //函数功能:依次输出指针数组元素所指向的字符串。array指向的数组元素。 void printName(char * array[], int size) { int i; for(i=0;i<=size;i++) printf("%s\n",array[i]); } //函数功能:释放本程序中动态申请的内存。 void freeName(char *array[],int size) { int i; for(i=0;i<=size;i++){ free(*(array+i)); } free(array); } //函数功能:读取字符串并返回其长度 int inputch(char string[],int size) { char ch; int length=0; scanf("%c",&ch); while(ch!='\n'){ string[length]=ch; scanf("%c",&ch); length++; } string[length]='\0'; return length; } 运行效果如图:
|
|