字符串字典排序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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; iprintf("%s\n",lineptr[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;
}

相关文档
最新文档