指针数组实例

问题:按每一个输入行的长度进行排序

读取所有输入行、对文本行进行排序、按次序打印文本行.

#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、函数参数写法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值