您的位置:首页 > 移动开发 > 微信开发

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

2012-10-21 10:18 417 查看
#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息