续nqsort

YEASH!!!

TLHL28 posted @ Thu, 29 May 2008 04:37:59 +0800 in C语言 with tags C语言 , 1404 readers

刚发现有这样适合 programmer的BLOG!

就把我今天刚作的C语言的小练习方上来看看先~~

初学编程,练习是 The C programming language 里的

练习5-14

请指教...
 

  1. /*对输入文本进行排序,
  2. *nqsort -n -r
  3. *其中参数 -n 是按数值排序, -r是逆序
  4. * *exercise.5-13.in 《The C Programming Language》,page102 */
  5.  
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9.  
  10. #define MAXLINES 5000
  11. char *lineptr[MAXLINES];
  12.  
  13. int readlines(char *lineptr[],int nlines);
  14. void writelines(char *lineptr[], int nlines);
  15. void swap(void *v[],int i, int j);
  16.  
  17. void nqsort(void *lineptr[],int left, int right,int argument,
  18.                 int (*comp)(void *, void *));
  19. int numcmp(char *, char *);
  20.  
  21. int main(int argc, char **argv)
  22. {
  23.     int c;
  24.     int nlines = 0;
  25.     int numeric = 0,reverse = 0;
  26.  
  27.     while(--argc > 0 && *(++argv)[0] == '-')
  28.        while((c = *++argv[0]))
  29.         switch(c){
  30.             case 'n':
  31.                 numeric = 1;
  32.                 break;
  33.             case 'r':
  34.                 reverse = 1;
  35.                 break;
  36.             default:
  37.                 printf("nnqsort: illegal option %c \n",c);
  38.                 argc = 0;
  39.                 break;
  40.        }
  41.     printf("n:%d\n r:%d\n",numeric,reverse);
  42.     if(argc != 0)
  43.         printf("Usage: nqort -n -r \n");
  44.     else{
  45.         if((nlines = readlines(lineptr,MAXLINES)) >= 0) {
  46.             nqsort((void **)lineptr,0,nlines-1,reverse,
  47.                     (int (*)(void *, void *))(numeric ? numcmp : strcmp));
  48.             writelines(lineptr, nlines);
  49.             return 0;
  50.         }else {
  51.             printf("input too big to sort\n");
  52.             return 1;
  53.         }
  54.     }   
  55.     return 0;
  56. }
  57.  
  58. void nqsort(void *v[],int left, int right,int reverse,
  59.             int (*comp)(void *, void *))
  60. {
  61.     int i, last;
  62.     if(left >=right)    /*如果数组元素的个数小于2,则返回*/
  63.         return;
  64.     swap(v, left, (left + right)/2);
  65.     last = left;
  66.     for(i = left+1;i <= right;++i)
  67.         /*reverse: 当逆序参数生效时,将排序程序的左右两个比较参数调换位置,就达到
  68.          * 逆序排序的效果*/
  69.         if((*comp)((reverse ? v[left] : v[i]),(reverse ? v[i] : v[left])) <0 )
  70.             swap(v, ++last, i);
  71.     swap(v,left,last);
  72.     nqsort(v,left, last-1,reverse,comp);
  73.     nqsort(v, last+1, right,reverse,comp);
  74. }
  75.  
  76. /*数字排序*/
  77. int numcmp(char *s1, char *s2)
  78. {
  79.     double v1,v2;
  80.  
  81.     v1 = atof(s1);
  82.     v2 = atof(s2);
  83.  
  84.     if(v1 < v2)
  85.         return -1;
  86.     else if(v1 > v2)
  87.         return 1;
  88.     else
  89.         return 0;
  90. }
  91.  
  92. #define MAXLEN 1000 /*  每个输入文本行的最大长度*/
  93.  
  94. int getline(char s[],int);
  95. char *alloc(int);
  96.  
  97. /*  readlines函数:读取输入行*/
  98. int readlines(char *lineptr[],int maxlines)
  99. {
  100.     int len, nlines;
  101.     char *p, line[MAXLEN];
  102.  
  103.     nlines = 0;
  104.     while((len = getline(line,MAXLEN)) > 0)
  105.         if(nlines >=maxlines || (p = alloc(len)) == NULL)
  106.             return -1;
  107.         else{
  108.             line[len-1] = '\0'; /*删除换行符 */
  109.             strcpy(p,line);
  110.             lineptr[nlines++] = p;
  111.            
  112.         }
  113.    
  114.     return nlines;
  115. }
  116.  

Login *


loading captcha image...
(type the code from the image)
or Ctrl+Enter