对输入的文本行排序 (《C程序设计语言》 第二版)

来源:互联网 发布:淘宝大学总裁班怎么样 编辑:程序博客网 时间:2024/06/06 04:50
#include <stdio.h>#include <string.h>#define MAXLINES 5000char *lineptr[MAXLINES];int readlines(char *lineptr[], int nlines);void writelines(char *lineptr[], int nlines);void qsort(char *lineptr[], int left, int right);main(){int nlines;if ((nlines = readlines(lineptr, MAXLINES)) >= 0){qsort(lineptr, 0, nlines-1);writelines(lineptr, nlines);return 0;}else{printf("error: input too big to sort\n");return 1;}}#define MAXLINE 1000int getline(char *, int);char *alloc(int);int readlines(char *lineptr[], int maxlines){int len, nlines;char *p, line[MAXLINE];    nlines = 0;while ((len = getline(line, MAXLINE)) > 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]);}void qsort(char *v[], int left, int right){int i, last;void swap(char *v[], int i, int j);if (left >= right)return;swap(v, left, (left + right)/2);last = left;for (i = left+1; i <= right; i++)if(strcmp(v[i], v[left]) < 0)swap(v, ++last, i);swap(v, left, last);qsort(v, left, last-1);qsort(v, last+1, right);}void swap(char *v[], int i, int j){char *temp;temp = v[i];v[i] = v[j];v[j] = temp;}int getline(char *s, int lim){int c, i;for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)s[i] = c;if (c == '\n'){s[i] = c;++i;}s[i] = '\0';return i;}#define ALLOCSIZE 10000static char allocbuf[ALLOCSIZE];static char *allocp = allocbuf;char *alloc(int n){if(allocbuf + ALLOCSIZE -allocp >= n){allocp += n;return allocp -n;}elsereturn 0;}

原创粉丝点击