對輸入的文本行進行排序

好程序員訓練營

<A href="http://www.goodprogrammer.org/" target="blank">ios培訓</A>

------我的c語言筆記,期待與您交流! 

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define MAXLEN 1000

#define MAXLINES 5000

#define ALLOCSIZE 10000


static char allocbuf[ALLOCSIZE];

static char *allocp=allocbuf;

int numcmp(char *,char *);

int getline(char s[],int lim);

/*getline函數:將行保存到s中,並返回該行的長度;輸入參數,指向一行的指針和最大行長度*/

char *alloc(int n);

/* alloc函數:返回指向n個字符的指針;輸入:字符的數量*/

int strcmp(char *,char *);

char *lineptr[MAXLINES];


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

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

void qsort(void *lineptr[],int left,int right,int(*comp)(void *,void *));

int numcmp(char *,char *);

int strcmp(char *,char *);



/* alloc函數:返回指向n個字符的指針*/

char *alloc(int n)

{

    if(allocbuf+ALLOCSIZE-allocp>=n)

    {

        allocp+=n;

        return allocp-n;

    }

    else

    return 0;

}


/* afree函數:釋放p指向的存儲區*/

void afree(char *p)

{

    if(p>=allocbuf && p<allocbuf+ALLOCSIZE)

        allocp=p;

}


/*getline函數:將行保存到s中,並返回該行的長度*/

int getline(char s[],int lim)

{

    int c,i;

    i=0;

    while(--lim>0 &&(c=getchar())!=EOF && c!='\n')

       s[i++]=c;

    if(c=='\n')

s[i++]=c;

    s[i]='\0';

    return i;

}


/*numcmp函數:按數值順序比較字符串s1和s2*/

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;

}


/*qsort函數:以遞增順序對v[left]...v[right]進行排序*/

void swap(void *v[],int i,int j)

{

    void *temp;


    temp=v[i];

    v[i]=v[j];

    v[j]=temp;

}


void qsort(void *v[],int left,int right ,int (*comp)(void *,void *))

{

    int i,last;

    void swap(void *v[],int,int);


    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);


    qsort(v,left,last-1,comp);

    qsort(v,last+1,right,comp);

}


/* 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;

}


/*strcmp函數:根據s按照字典順序小於、等於或大於t的結果分別返回負整數、0或正整數 */

int strcmp(char *s,char *t)

{

    int i;


    for(i=0;s[i]==t[i];i++)

if(s[i]=='\0')

    return 0;

    return s[i]-t[i];

}


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

{

    while(nlines-->0)

        printf("%s\n",*lineptr++);

}


/*對輸入的文本行進行排序*/

int main()

{

    int nlines;

    int numeric=0;

    int argc=3;

    char *argv[]={"echo","-n,","world",0};


    if(argc>1 && strcmp(argv[1],"-n")==0)

        numeric=1;

    if((nlines=readlines(lineptr,MAXLINES))>=0)

    {

     qsort((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;

     }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章