K&R名著<C程序设计语言>p103函数指针:串联以前小程序

#include <stdio.h>
#include <string.h>

#define MAXLINES 5000
char *lineptr[MAXLINES];

int readlines(char*lineptr[], int nlines);
void writelines(char *lineptr[], int nlines);

void qsort1(char*lineptr[],int left, int right, int (*comp)(void*, void*));
int numcmp(char*, char*);

int main(int argc, char *argv[])
{
    int nlines;
    int numeric = 0;

    if (argc > 1 && strcmp(argv[1],"-n") == 0)
        numeric = 1;
    if ((nlines = readlines(lineptr, MAXLINES)) >= 0)
    {
        qsort1((void *)lineptr, 0, nlines - 1, (int(*)(void*,void*))(numeric?numcmp:strcmp));
        writelines(lineptr,nlines);
        return 0;
    }else {
        printf("input too big to sort!\n");
        return 1;
    }
}



//qsort1函数:以递增顺序对v[left]...v[right]进行排序
void qsort1(char*v[], int left, int right, int (*comp)(void*, void*))
{
    int i, last;
    void swap(char*v[], int i, int j);
    
    if (left >= right)
        return;
    swap(v, left, (left + right) / 2);
    last = left;
    for (i = left + 1; i <= right; ++i)
        if ((*comp)(v[i],v[left]) < 0)
            swap(v, ++last, i);
        swap(v, left, last);
        qsort1(v, left, last-1,comp);
        qsort1(v,last+1,right,comp);
    
}
void swap(char*v[], int i, int j)
{
    char *temp;
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}


//numcmp函数:按数值顺序比较字符串1和2
#include <stdlib.h>
int numcmp(char*s1, char*s2)
{
    double v1, v2;
    v1 = atof(s1);
    v2 = atof(s2);
    if(v1 < v2)
        return -1;
    else if(v1 > v2)
        return 1;
    else
        return 0;
}


#define MAXLEN  1000
int getline1(char *,int);
char *alloc(int );


//readlines函数:读取输入行
int readlines(char *lineptr[], int maxlines)
{
    int len, nlines;
    char *p, line[MAXLEN];
    nlines = 0;
    while ((len = getline1(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]);
}

 /* *************************************************************************
  动态分配内存函数与释放函数
  ***************************************************************************
 */

#define ALLOCSIZE 10000

static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf;

char *alloc(int n)
{
   if (allocbuf + ALLOCSIZE -allocp >= n) {
     allocp += n;
     return allocp - n;
   }   else
     return 0;
}

void afree(char *p)
{
    if (p > allocbuf && p < allocbuf +ALLOCSIZE)
       allocp =p;
}

/**************************************************************
读书入行函数,返回实际读取个数
**************************************************************
*/
int getline1(char *s, int lim)
{
   int c;
   char *t = s;

   while(--lim > 0 && (c =getchar()) !=EOF && c != '\n')
       *s++ = c;
   if (c == '\n')
       *s++ = c;
   *s ='\0';
   return s-t;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值