fork(1) download
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define MAXLINES 5000 /* максимальное число строк */
  5. char *lineptr[MAXLINES]; /* указатели на строки текста */
  6. int readlines(char *lineptr[], int nlines);
  7. void writelines(char *lineptr[], int nlines);
  8. void qqsort(void *lineptr[], int left, int right,int (*comp)(void *, void *));
  9. char *allloc(int n);
  10. int numcmp(char *, char *);
  11. int getline(char *s, int lim);
  12. /* сортировка строк */
  13. main(int argc, char *argv[])
  14. {
  15. int nlines; /* количество прочитанных строк */
  16. int numeric = 0; /* 1, если сорт. по числ. знач. */
  17. if (argc > 1 && strcmp(argv[1], "-n") == 0)
  18. numeric = 1;
  19. if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
  20. qqsort((void **) lineptr, 0, nlines-1,(int (*)(void*,void*))(numeric ? numcmp : strcmp));
  21. writelines(lineptr, nlines);
  22. return 0;
  23. } else {
  24. printf("Bведено слишком много строк\n");
  25. return 1;
  26. }
  27. }
  28.  
  29. #define MAXLEN 1000
  30.  
  31. int readlines(char *lineptr[], int maxlines)
  32. {
  33. int len, nlines;
  34. char *p, line[MAXLEN];
  35.  
  36. nlines = 0;
  37. while ((len = getline(line, MAXLEN)) > 0)
  38. if (nlines >= maxlines || (p = allloc(len)) == NULL)
  39. return -1;
  40. else {
  41. line[len-1] = '\0'; /* убираем символ \n */
  42. strcpy(p, line);
  43. //printf("%d\n",line);
  44. //printf("%d",p);
  45. lineptr[nlines++] = p;
  46. }
  47. return nlines;
  48. }
  49.  
  50. void qqsort(void *v[], int left, int right, int (*comp)(void *, void *))
  51. {
  52. int i, last;
  53. void swap(void *v[], int, int);
  54. if (left >= right) /* ничего не делается, если */
  55. return; /* в массиве менее двух элементов */
  56. swap(v, left, (left + right)/2);
  57. last = left;
  58. for (i = left+1; i <= right; i++)
  59. if ((*comp)(v[i], v[left]) < 0)
  60. swap(v, ++last, i);
  61. swap(v, left, last);
  62. qqsort(v, left, last-1, comp);
  63. qqsort(v, last+1, right, comp);
  64. }
  65.  
  66. /* numcmp: сравнивает s1 и s2 как числа */
  67. int numcmp(char *s1, char *s2)
  68. {
  69. double v1, v2;
  70. v1 = atof(s1);
  71. v2 = atof(s2);
  72. if (v1 < v2)
  73. return -1;
  74. else if (v1 > v2)
  75. return 1;
  76. else
  77. return 0;
  78. }
  79.  
  80. void writelines(char *lineptr[], int nlines)
  81. {
  82. int i;
  83. for (i = 0; i < nlines; i++)
  84. printf("%s\n", lineptr[i]);
  85. }
  86.  
  87. #define ALLOCSIZE 10000 /* размер доступного пространства */
  88. static char allocbuf[ALLOCSIZE]; /* память для alloc */
  89. static char *allocp = allocbuf; /* указатель на своб. место */
  90. char *allloc(int n) /* возвращает указатель на n символов */
  91. {
  92. if (allocbuf + ALLOCSIZE - allocp >= n) {
  93. allocp += n; /* пространство есть */
  94. return allocp - n; /* старое p */
  95. } else /* пространства нет */
  96. return 0;
  97. }
  98.  
  99. int getline(char *s, int lim)
  100. {
  101. int c, i;
  102. for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
  103. s[i] = c;
  104. if (c == '\n') {
  105. s[i] = c;
  106. ++i;
  107. }
  108. s[i] = '\0';
  109. return i;
  110. }
  111. void swap(void *v[], int i, int j)
  112. {
  113. void *temp;
  114. temp = v[i];
  115. v[i] = v[j];
  116. v[j] = temp;
  117. }
Success #stdin #stdout 0s 9472KB
stdin
Standard input is empty
stdout
Standard output is empty