按字符串长度排序可以分为以下三个步骤:
读取所有输入行
对文本进行排序
- 按次序打印文本行
代码如下:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define MAXLEN 1000
char *alloc(int);
int getline(char *p,int n);//读取一行字符
int readline(char *lineptr[],int maxlines);//读取所有输入行
void qsort(char *lineptr[],int left,int right);//对字符串进行排序
void writeline(char *lineptr[],int lines);//打印
void swap(char *lineptr[],int i,int j);//交换指针
int main()
{
char *p[100];
int i;
i = readline(p,100);
//swap(p,0,1);
qsort(p,0,i-1);
writeline(p,i);
//printf("%s",p[1]);
printf("%d\n",i);
return 0;
}
int getline(char s[],int n)
{
int i;
int c;
for(i=0;i<n-1&&(c=getchar())!='\n'&&c!=EOF;i++)
s[i]=c;
if(c=='\n')
{
s[i]=c;
i++;
}
s[i] ='\0';
return i;
}
int readline(char *lineptr[],int maxlines)
{
int len,nlines;
char *p;
char line[MAXLEN];
nlines = 0;
while((len = getline(line,MAXLEN)) >0 )
if(nlines >= maxlines || (p = (char*)malloc(len)) == NULL) //p=alloc[len]ÉêÇëÄÚ´æ¿Õ¼ä
return -1;
else
{
line[len-1]='\0'; //ɾ³ýÁË»»Ðзû
strcpy(p,line);
lineptr[nlines++] = p;
}
return nlines;
}
void writeline(char *lineptr[],int lines)
{
int i=0;
for(i=0;i<lines;i++)
printf("%s\n",lineptr[i]);
}
void qsort(char *lineptr[],int left,int right)
{
int i,last;
if(left>=right)
return ;
swap(lineptr,left,(left+right)/2);
last = left;
for(i=left+1;i<=right;i++)
//if(strcmp(lineptr[i],lineptr[left])<0)
if(strlen(lineptr[i])<strlen(lineptr[left]))//比较字符串长度
swap(lineptr,++last,i);
swap(lineptr,left,last);
qsort(lineptr,left,last-1);
qsort(lineptr,last+1,right);
}
void swap(char *lineptr[],int i,int j)
{
char *temp;
temp = lineptr[i];
lineptr[i]=lineptr[j];
lineptr[j] = temp;
}
运行结果: