K& R排序示例

时间:2016-05-21 03:42:33

标签: c kernighan-and-ritchie

在第5章K& R C编程模块11中

有一个排序代码示例,用于解释函数指针。

我有两个问题。

  1. main函数中,为何投选(void**)lineptr
  2. 我收到警告:
      

    此行中出现的指针类型不匹配

         

    qsort1((void**)lineptr,0,nlines-1, (int (*)(void *,void*))(numeric ? numcmp : strcmp));

  3. 我仍然没有想出来解决这个错误。

    您可以阅读以下代码

    提前致谢。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    
    #define MAXLEN 1000
    #define ALLOCSIZE 1000000 /*size of available space*/
    #define MAXLINES 5000
    
    
    char *lineptr[MAXLINES];
    
    int readlines(char *lineptr[],int nlines);
    void writelines(char *lineptr[] ,int nlines);
    
    void qsort1(void *lineptr[],int left,int right , int (*comp)(void *,void *));
    int numcmp(char *,char *);
    
    int getline(char *,int);
    char *alloc(int);
    
    
    static char allocbuf[ALLOCSIZE];
    static char *allocp = allocbuf;
    
    
    main(int argc , char *argv[]){
        int nlines;
        int numeric = 0; /*1 if numeric sort*/
    
        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;
        }
    }
    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;
            }
    
    }
    void writelines(char *lineptr[],int nlines){
            int i;
            for(i=0;i<nlines;i++)
                printf("%s\n",lineptr[i]);
    }
    
    
    void qsort1(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);
        qsort1(v,left,last-1,comp);
        qsort1(v,last+1,right,comp);
    }
    
    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;
    }
    void swap(void *v[],int i, int j){
    
        void *temp;
    
        temp = v[i];
        v[i] = v[j];
        v[j] = temp;
    }
    int getline(char *s,int max){
        int c,i;
    
        for(i=0 ;  (c=getchar()) != EOF && c != '\n';i++)
            *s++ = c;
        if(c == '\n'){
            *(s+i) = c;
              i++;  
    
        }
        *(s+i) = '\0';
        return i;
    }
    
    char *alloc(int n)
    {
        if(allocbuf + ALLOCSIZE - allocp >= n){
            allocp += n;
            return allocp - n;
        }else
            return 0;
    }
    

0 个答案:

没有答案
相关问题