+void destroy(struct file_with_size *node) {
+ struct file_with_size *next;
+ while(node) {
+ next = node->next;
+ free(node->filename);
+ free(node);
+ node = next;
+ }
+}
+
+/**********************************************************************/
+
+int compare_files(const void *x1, const void *x2) {
+ const struct file_with_size **f1, **f2;
+
+ f1 = (const struct file_with_size **) x1;
+ f2 = (const struct file_with_size **) x2;
+
+ if((*f1)->size < (*f2)->size) {
+ return -1;
+ } else if((*f1)->size > (*f2)->size) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+void print_sorted(struct file_with_size *root, int height) {
+ struct file_with_size *node;
+ struct file_with_size **nodes;
+ int nb, n, first;
+
+ nb = 0;
+ for(node = root; node; node = node->next) {
+ nb++;
+ }
+
+ nodes = malloc(nb * sizeof(struct file_with_size *));
+
+ n = 0;
+ for(node = root; node; node = node->next) {
+ nodes[n++] = node;
+ }
+
+ qsort(nodes, nb, sizeof(struct file_with_size *), compare_files);
+
+ /*
+ for(n = 0; n < nb; n++) {
+ printf("%lld %s\n",
+ nodes[n]->size,
+ nodes[n]->filename);
+ }
+ */
+
+ first = 0;
+ if(height > 0 && height < nb) {
+ first = nb - height;
+ }
+ for(n = first; n < nb; n++) {
+ if(nodes[n]->size < 1024) {
+ printf("% 7d %s\n",
+ ((int) nodes[n]->size),
+ nodes[n]->filename);
+ } else if(nodes[n]->size < 1024 * 1024) {
+ printf("% 6.1fK %s\n",
+ ((double) (nodes[n]->size))/(1024.0),
+ nodes[n]->filename);
+ } else if(nodes[n]->size < 1024 * 1024 * 1024) {
+ printf("% 6.1fM %s\n",
+ ((double) (nodes[n]->size))/(1024.0 * 1024),
+ nodes[n]->filename);
+ } else {
+ printf("% 6.1fG %s\n",
+ ((double) (nodes[n]->size))/(1024.0 * 1024.0 * 1024.0),
+ nodes[n]->filename);
+ }
+ }
+
+ free(nodes);
+}
+
+/**********************************************************************/
+