[ create a new paste ] login | about

Link: http://codepad.org/GS5ddAML    [ raw code | fork ]

C, pasted on Jun 4:
#include <stdio.h>
#include <stdlib.h>
#define FILENAME "test.txt"
#define N 1024
void readfile(int *n, int (**a)[]) {
  static char buff[N];
  FILE *fp;
  if ((fp = fopen(FILENAME, "r")) != 0) {
    fgets(buff, N, fp);
    if (sscanf(buff, "%d", n) == 1) {
      int i;
      if ((*a = malloc(sizeof(int) * (*n))) == 0) { /* abnormal */
        *a = 0;
        return;
      }
      for (i = 0; i < *n; i++) {
        fgets(buff, N, fp);        
        if (sscanf(buff, "%d", &(**a)[i]) != 1) { /* abnormal */
          *n = i;
          return;
        }
      }
      fprintf(stderr, "done reading.\n");
    }
    fclose(fp);
  }
}

void vomit(int p, int level, int n, int (*a)[]) {
  int i;
  if (p < n) {
    vomit(2 * p + 1, level + 2, n, a);
    for (i = 0; i < level; i++)
      printf("  ");
    printf("%d\n", (*a)[p]);
    vomit(2 * p + 2, level + 2, n, a);
  }
#if 0
  int i;
  printf("> ");
  for (i = 0; i < n; i++)
    printf("%d ", (*a)[i]);
  putchar('\n');
#endif
}

void swap(int *a, int *b) {
  int t;
  printf("%d<->%d\n", *a, *b);
  t = *a;
  *a = *b;
  *b = t;
}

int compare(int a, int b) {
  return a < b;
}

void task_heap(int *n, int (**a)[]) {
  int idx, m, p, i;

  vomit(0, 0, *n, *a);
  printf("---------------------------------\n");

  /* initial */
  if (*n >= 2 && compare((**a)[1], (**a)[0])) {
    swap(&(**a)[0], &(**a)[1]); printf("*1\n");
  }
  if (*n >= 3 && compare((**a)[2], (**a)[0])) {
    swap(&(**a)[0], &(**a)[2]); printf("*2\n");
  }
  /* forward step */
  if (*n >= 4) {
    for (idx = 3; idx < *n; idx++) {
      for (m = idx; m > 0;  m = p) {
        p = (m - 1) / 2;
        if (compare((**a)[m], (**a)[p])) {
          swap(&(**a)[m], &(**a)[p]);
          vomit(0, 0, *n, *a);
          printf("---------------------------------\n");
        }
      }
    }
  } /* if (*n >= 4) { */
  /* backward */
  for (idx = *n - 1; idx > 0; --idx) {
    printf("drawing top\n");
    swap(&(**a)[0], &(**a)[idx]);
    vomit(0, 0, idx, *a);                      
    printf("---------------------\n");
    for (p = 0; 2 * p + 1 < idx; /* nothing */) {
      if (2 * p + 2 < idx) {
        if (compare((**a)[2 * p + 1], (**a)[2 * p + 2])) {
        label:
          if (compare((**a)[2 * p + 1], (**a)[p])) {
            swap(&(**a)[p], &(**a)[2 * p + 1]);
            p = 2 * p + 1;
          } else
            break;
        } else {
          if (compare((**a)[2 * p + 2], (**a)[p])) {
            swap(&(**a)[p], &(**a)[2 * p + 2]);
            p = 2 * p + 2;
          } else
            break;
        }
        vomit(0, 0, idx, *a);                      
        printf("---------------------\n");
        continue;
      } else {
        goto label;
      }
    }
  }
  for (i = 0; i < *n; i++)
    printf("%d, ", (**a)[i]);
  putchar('\n');
}

int main() {
  int n, (*a)[];
  a = 0;
  readfile(&n, &a);
  if (a != 0) {
    task_heap(&n, &a);
    free(*a);
  }
  return 0;
}
/* end */


Output:
No errors or program output.


Create a new paste based on this one


Comments: