棱怎么读:指针数组,排序,创建一个长度为size的动态指针数组,然后从键盘读取size个学生的名字存储到字符数组中,字符数组首元素地址存储到指针数组元素中

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 05:00:24

 

26.指针数组,排序,创建一个长度为size的动态指针数组,然后从键盘读取size个学生的名字存储到字符数组中,字符数组首元素地址存储到指针数组元素中

 

#include

#include

#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所指字符相等,则肯定指向‘\0’

        return 0;

   else if(*s>*t)//任何一个字符均大于‘\0’( ‘\0’ ASCII为0)

        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;

}

运行效果如图: