代码之家  ›  专栏  ›  技术社区  ›  cristid9 Rakesh Kumar

K&R第5.11节中的排序程序

  •  0
  • cristid9 Rakesh Kumar  · 技术社区  · 12 年前

    这是可以在K&R第5.11节。

    alloc.c :

    #include <stdio.h>
    
    #define BUFSIZE 10000   
    
    static char allocbuf[BUFSIZE];
    static char *allocp = allocbuf;
    
    char *alloc(int n) {
       if(allocbuf + BUFSIZE - allocp >= n) {
           allocp += n;
           return allocp - n;
       }
       else {
           return NULL;
       }
    }
    

    io.c :

    #include <stdio.h>
    #include <string.h>
    #define MAXLEN 1000
    
    
    char *alloc(int);
    
    int getLine(char *s, int maxline) {
       int i;
       int c;
    
       c = getchar();
       maxline--;
       for(i = 0; c != EOF && c != '\n' && maxline > 0; i++, c = getchar(), maxline-- ) {
           s[i] = c;
       }
    
       if(c == '\n') {
           s[i] = c;
           i++;
       }
       s[i] = '\0';
       return i;
    }
    
    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;
    }
    
    void writelines(char *lineptr[], int nlines) {
       int i;
    
       for(i = 0; i < nlines; i++)
           printf("%s\n", lineptr[i]);
    
    }
    

    main.c :

    #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 qqsort(void *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) {
           qqsort((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;
       }
    }
    

    readlines.c :

    #include <stdlib.h>
    
    void swap(void *v[], int i, int j) {
       void * tmp;
    
       tmp = v[i];
       v[i] = v[j];
       v[i] = tmp;
    }
    
    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 qqsort(void *v[], int left, int right, int(*comp)(void *, void *)) {
       int i, last;
       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);
       qqsort(v, left, last - 1, comp);
       qqsort(v, last + 1, right, comp);
    }
    

    问题是我实际上不明白这个程序在做什么。它应该从输入中读取一些行,并按照排序顺序打印它们。但与输入相比,程序的输出没有变化。

    例如:

    当输入为:

    test1
    asdasdasdas
    test2
    fobafoobarfoobar
    barfoobarfoobarfooofoobar
    

    输出为:

    测试1
    阿斯达斯达斯
    测试2
    fobafoabarfoobar公司
    巴符巴符巴
    

    当符号参数 "-n" 输出仍然相同。 例如: 输入:

    1234234432
    2333
    2222222
    23423
    1
    

    输出:

    1234234432
    2333
    2222222
    23423
    1.
    

    我想我不太理解这个项目的目的。阅读它的源代码和与之相关的文档,我就能知道应该做什么。程序并不像我预期的那样工作。 在第二个示例中,我希望输出如下:

    1
    2333
    23423
    2222222
    1234234432
    

    有人能解释一下我做错了什么吗? 顺便说一句,这个程序可以在K&R 2第133页。

    1 回复  |  直到 12 年前
        1
  •  1
  •   Lee Duhem    12 年前

    那个 swap() 错误:

       tmp = v[i];
       v[i] = v[j];
       v[i] = tmp;
    

    最后一个 v[i] = tmp; 做这个 swap() 无操作(无操作),应该是 v[j] = tmp; .

    所以试试这个:

    void swap(void *v[], int i, int j) {
       void * tmp;
    
       tmp = v[i];
       v[i] = v[j];
       v[j] = tmp;
    }
    
    推荐文章