uuprog
diff sort.c @ 0:4f628556fa3e
uuprog initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Thu, 25 Aug 2011 08:53:01 +0300 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/sort.c Thu Aug 25 08:53:01 2011 +0300 1.3 @@ -0,0 +1,95 @@ 1.4 +/*! cc -o sort sort.c */ 1.5 +#include <stdio.h> 1.6 +#include <stdlib.h> 1.7 +#include <string.h> 1.8 + 1.9 +struct lnode { 1.10 + char *line; 1.11 + struct lnode *next; 1.12 +}; 1.13 + 1.14 +struct lnode *get_line(void); 1.15 +int cmp(const void *a, const void *b); 1.16 + 1.17 +int main(void) 1.18 +{ 1.19 + struct lnode *tmp, *list = 0; 1.20 + char **arr; 1.21 + size_t i, line_count = 0; 1.22 + 1.23 + while((tmp = get_line())) { 1.24 + if(list) { 1.25 + tmp->next = list; 1.26 + list = tmp; 1.27 + } else { 1.28 + list = tmp; 1.29 + } 1.30 + line_count++; 1.31 + } 1.32 + 1.33 + if(!(arr = malloc(line_count * sizeof *arr))) { 1.34 + perror("malloc failed"); 1.35 + return 1; 1.36 + } 1.37 + 1.38 + for(i=0; i<line_count; i++) { 1.39 + arr[i] = list->line; 1.40 + 1.41 + tmp = list; 1.42 + list = list->next; 1.43 + free(tmp); 1.44 + } 1.45 + 1.46 + qsort(arr, line_count, sizeof *arr, cmp); 1.47 + 1.48 + for(i=0; i<line_count; i++) { 1.49 + puts(arr[i]); 1.50 + free(arr[i]); 1.51 + } 1.52 + free(arr); 1.53 + return 0; 1.54 +} 1.55 + 1.56 +struct lnode *get_line(void) 1.57 +{ 1.58 + struct lnode *node; 1.59 + char *buf; 1.60 + size_t bufsz = 128; 1.61 + size_t used_buf = 0; 1.62 + int c; 1.63 + 1.64 + if(!(buf = malloc(bufsz))) { 1.65 + perror("malloc failed"); 1.66 + exit(1); 1.67 + } 1.68 + 1.69 + while((c = getchar()) >= 0 && c != '\n') { 1.70 + if(used_buf >= bufsz - 1) { 1.71 + size_t newsz = bufsz * 2; 1.72 + if(!(buf = realloc(buf, newsz))) { 1.73 + perror("malloc failed"); 1.74 + exit(1); 1.75 + } 1.76 + bufsz = newsz; 1.77 + } 1.78 + buf[used_buf++] = c; 1.79 + } 1.80 + buf[used_buf] = 0; 1.81 + 1.82 + if(!used_buf) { 1.83 + return 0; 1.84 + } 1.85 + 1.86 + if(!(node = malloc(sizeof *node))) { 1.87 + perror("malloc failed"); 1.88 + exit(1); 1.89 + } 1.90 + node->line = buf; 1.91 + node->next = 0; 1.92 + return node; 1.93 +} 1.94 + 1.95 +int cmp(const void *a, const void *b) 1.96 +{ 1.97 + return strcmp(*(char**)a, *(char**)b); 1.98 +}