2014-03-05 48 views
0

這是排序程序,可以在K & R章節5.11中找到。排序程序在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); 
} 

問題是我實際上不明白這個程序在做什麼。它應該從輸入中讀取一些行,並且應該按照排序順序打印它們。但是,與輸入相比,我發現程序的輸出沒有變化。

例如:

當intput是:

test1 
asdasdasdas 
test2 
fobafoobarfoobar 
barfoobarfoobarfooofoobar 

的輸出是:

test1 
asdasdasdas 
test2 
fobafoobarfoobar 
barfoobarfoobarfooofoobar 

當符號參數"-n"給出,輸出仍然是相同的。 例如: 輸入:

1234234432 
2333 
2222222 
23423 
1 

輸出:

1234234432 
2333 
2222222 
23423 
1 

我想我不明白,這個計劃的目的非常好。閱讀它的源代碼和相關文檔,我可以弄清楚應該做什麼。該程序無法按預期工作。 在第二個例子我希望輸出的樣子:

1 
2333 
23423 
2222222 
1234234432 

有人能解釋我什麼我做錯了嗎? 順便說一句,這個程序可以以K & R 2在頁面發現133

+0

'C =的getchar(); maxline--;對於(i = 0; c!= EOF && c!='\ n'&& maxline> 0; i ++,c = getchar(),maxline--){' 您正在調用'getchar 'getline(...)',是否有必要? – dud3

回答

1

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; 
} 
+1

@IonutGrt。哦,有一個區別。在最後一行中,我是'v [j]',你是'v [i]'。 –