字符串字典排序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*
字符串输入,以超过最大字符数为
停止输入的条件,用快排排序,改
变指针指向的字符串首地址(按字
典序),最后打印。
*/
#include
#include
#define MAXLINES 10 //进行排序的最大文本行数
#define MAXLEN 10 //每个输入文本行的最大长度
#define ALLOCSIZE 500 //可用空间大小
char *lineptr[MAXLINES]; //指向文本行的指针数组
static char allocbuf[ALLOCSIZE]; //alloc使用的存储区
static char *allocp=allocbuf; //下一个空闲位置
int getline(char *,int); //将一行读入到s中并返回其长度
char *alloc(int); //返回指向n个字符的指针
int readlines(char *lineptr[],int nlines); //读取输入行
void writelines(char *lineptr[],int nlines); //写输入行
void qsort(char *lineptrp[],int left,int right); //按递增顺序对v[left]-v[right]进行排序
void swap(char *v[],int i,int j); //交换v[i]和v[j]
int main()
{
int nlines; //读取的输入行数目
if((nlines=readlines(lineptr,MAXLINES))>=0) //注意readline的停止条件:
{
qsort(lineptr,0,nlines-1);
writelines(lineptr,nlines);
return 0;
}
else
{
printf("Error:Input too big to sort.\n");
return 1;
}
}
char *alloc(int n) //返回指向n个字符的指针
{
if(allocbuf+ALLOCSIZE-allocp>=n)
{
allocp+=n;
return allocp-n;
}
else
return 0;
}
int getline(char *s,int lim) //将一行读入到s中并返回其长度
{
char c;
int i;
for(i=0; (c=getchar())!=EOF&&c!='\n'; i++)
s[i]=c;
if(c='\n')
s[i++]=c;
s[i]='\0';
if(i<=lim)
return i;
else
return -1;
}
int readlines(char *lineptr[],int maxlines) //读取输入行
{
int len,nlines;
char *p,line[MAXLEN];
nlines=0;
while(len=getline(line,MAXLEN)>0) //输入字符大于MAXLEN
{
if(nlines>=maxlines||(p=alloc(len))==NULL) //行数过多或没有空间
return -1;
else
{
line[len-1]='\0'; //删除换行符
strcpy(p,line); //@
lineptr[nlines++]=p; //@
}
}
return nlines;
}
void writelines(char *lineptr[],int nlines) //写输入行
{
int i;
for(i=0; i
}
void qsort(char *v[],int left,int right) //按递增顺序对v[left]-v[right]进行排序
{
int i,last;
if(left>=right) //如果数组元素的个数小于2,则返回
return ;
swap(v,left,(left+right)/2);
last=left;
for(i=left+1; i<=right; i++)
if(strcmp(v[i],v[left])<0)
swap(v,++last,i);
swap(v,left,last);
qsort(v,left
,last-1);
qsort(v,left+1,last);
}
void swap(char *v[],int i,int j) //交换v[i]和v[j]
{
char *temp;
temp=v[i];
v[i]=v[j];
v[j]=temp;
}