问题:按每一个输入行的长度进行排序
读取所有输入行、对文本行进行排序、按次序打印文本行.
#include <stdio.h>
#include <string.h>
#define MAXLINES 5000 /* 进行排序的最大文本行数 */
#define MAXLEN 1000 /* 每个输入文本行的最大长度 */
char *alloc(int);
char *lineptr[MAXLINES];
int getline(char line[],int MAXLEN);
int readlines(char *lineptr[],int nlines);
void writelines(char *lineptr[],int nlines);
void qsort(char *lineptr[], int left, int right);
main()
{
int nlines; /* 读取的输入行数目 */
if((nlines = readlines(lineptr,MAXLINES)) >= 0)
{
qsort(lineptr,0,nlines - 1);
writelines(lineptr, nlines);
return 0;
} else {
printf("erroe : input too big to sort \n");
return 1;
}
}
/* alloc函数指针 专门开辟一片可控的存储区间 */
#define ALLOCSIZE 10000 /* 可用空间大小 */
static char allocbuf[ALLOCSIZE]; /* alloc使用的存储区 */
static char *allocp = allocbuf; /* 下一个空闲位置*/
char *alloc(int n) /* 返回指向n个字符的指针 */
{
if(allocbuf + ALLOCSIZE - allocp >= n) /* 有足够的空闲空间 */
{
allocp += n;
return allocp - n; /* 分配前的指针p */
}else
return 0;
}
void afree(char *p) /* 释放p指向的存储区 */
{
if(p >= allocbuf && p < allocbuf + ALLOCSIZE)
allocp = p;
}
/* getline函数: 将行保存到line中,并返回该行的长度 */
int getline(char line[],int MAXLEN)
{
int c,i;
i = 0;
while(--MAXLEN > 0; && (c = getchar()) != EOF && c != '\n') // int类型的c 为什么可以 = getchar ?
line[i++] = c;
if(c == '\n')
line[i++] = c;
line[i] = '\0';
return i;
}
/* readlines函数: 读取输入行 */
int readlines(char *lineptr[],int maxlines )
{
int len, nlines;
char *p, line[MAXLEN];
nlines = 0;
while((len = getline(line,MAXLEN)) > 0)
if( nlines >= maxlines || (p = alloc(len)) == NULL)
return -1;
else {
line[len - 1] = '\0'; /* 删除换行符 */
strcpy(p,line);
lineptr[nlines ++] = p;
}
return nlines;
}
/* writelines函数:写输出行 */
void writelines(char *lineptr[],int nlines)
{
int i;
for(i = 0; i< nlines; i++)
printf("%s\n",lineptr[i]);
}
/* qsort函数: 按递增顺序对v[left]...v[right]进行排序 */
void qsort(char *v[],int left, int right)
{
int i,last;
void swap(char *v[],int i, int j);
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,last + 1,right);
}
/* swap 交换函数 也要进行修改*/
void swap(char *v[], int i, int j)
{
char *temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
总结:1、解题思路 将每一个功能转换为数据流图 功能模块函数化
2、对于地址运算符的理解.
3、快速排序几种实现的思考.
4、掌握指针数组.
char *lineptr[MAXLINES] 表示每一个元素都是一个指向字符串类型的指针. *lineptr++ 代表地址++.
5、函数参数写法