26.指針數(shù)組,排序,創(chuàng)建一個(gè)長(zhǎng)度為size的動(dòng)態(tài)指針數(shù)組,然后從鍵盤讀取size個(gè)學(xué)生的名字存儲(chǔ)到字符數(shù)組中,字符數(shù)組首元素地址存儲(chǔ)到指針數(shù)組元素中
#include<stdio.h>
#include<stdlib.h>
#define N 20
/*創(chuàng)建一個(gè)長(zhǎng)度為size的動(dòng)態(tài)指針數(shù)組,然后從鍵盤讀取size個(gè)
學(xué)生的名字存儲(chǔ)到字符數(shù)組中,字符數(shù)組首元素地址存儲(chǔ)到指針數(shù)組元素中。*/
char ** inputName(int);
void sort(char *[], int); //函數(shù)功能:對(duì)字符串進(jìn)行排序。
void printName(char *[], int); //函數(shù)功能:依次輸出指針數(shù)組元素所指向的字符串。array指向的數(shù)組元素。
void freeName(char * [],int); //函數(shù)功能:釋放本程序中動(dòng)態(tài)申請(qǐng)的內(nèi)存。
main()
{
int size; //size表示要排序的人數(shù)
char **array;
printf("請(qǐng)輸入要排序的人數(shù):\n");
scanf("%d",&size);
printf("請(qǐng)輸入%d個(gè)學(xué)生的名字,每輸入一個(gè)用回車鍵結(jié)束:\n",size);
//從鍵盤讀取size個(gè)學(xué)生的名字存儲(chǔ)在字符數(shù)組中
array=inputName(size);
//對(duì)字符串進(jìn)行排序
sort(array,size);
printf("從小到大,這%d個(gè)學(xué)生的姓名為:",size);
//打印出size個(gè)學(xué)生的名字
printName(array,size);
system("pause");
//釋放動(dòng)態(tài)數(shù)組的內(nèi)存空間
freeName(array,size);
system("pause");
return 0;
}
/*創(chuàng)建一個(gè)長(zhǎng)度為size的動(dòng)態(tài)指針數(shù)組,然后從鍵盤讀取size個(gè)
學(xué)生的名字存儲(chǔ)到字符數(shù)組中,字符數(shù)組首元素地址存儲(chǔ)到指針數(shù)組元素中。*/
char **inputName(int size)
{
int inputch(char [],int); //讀取字符串并返回其長(zhǎng)度
char ** array;
char string[N]; //將讀取的字符串暫時(shí)存儲(chǔ)在string數(shù)組中
int i,length;
//申請(qǐng)動(dòng)態(tài)指針數(shù)組的內(nèi)存空間
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; //返回動(dòng)態(tài)指針數(shù)組的首地址
}
//函數(shù)功能:對(duì)字符串進(jìn)行排序。
void sort(char *a[], int size)
{
int strCmp(char*,char*); //比較兩個(gè)字符串的大小
char *tempPtr;
int i,j,min;
/*使用選擇法排序, 外循環(huán)每循環(huán)一次,確定name[i]的值*/
for(i=0; i<= size-1; i++){ /*外循環(huán):確定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) //若結(jié)束比較時(shí)s和t所指字符相等,則肯定指向‘\
return 0;
else if(*s>*t)//任何一個(gè)字符均大于‘\
return 1;
else
return -1;
}
//函數(shù)功能:依次輸出指針數(shù)組元素所指向的字符串。array指向的數(shù)組元素。
void printName(char * array[], int size)
{
int i;
for(i=0;i<=size;i++)
printf("%s\n",array[i]);
}
//函數(shù)功能:釋放本程序中動(dòng)態(tài)申請(qǐng)的內(nèi)存。
void freeName(char *array[],int size)
{
int i;
for(i=0;i<=size;i++){
free(*(array+i));
}
free(array);
}
//函數(shù)功能:讀取字符串并返回其長(zhǎng)度
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;
}
聯(lián)系客服