Mercurial > hg > Members > nobuyasu > CbC
view compare/tree/unbalance_binary_tree.cbc @ 22:13a2c13bbd0b draft
add unbalance_binary_tree.cbc
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 13 Aug 2012 03:49:55 +0900 |
parents | |
children | 5354e0f8f557 |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> typedef struct Node Node; struct Node { int num; Node *left; Node *right; }; typedef struct Ds Ds; struct Ds { Node *root; int *numbers; int size; int i; __code (*next)(Ds *ds); }; Node *make_node(); __code loop(Ds *ds); __code insert(Ds *ds, Node* p); __code create_nodes(Ds *ds); void print_nodes(Node *p); void free_nodes(Node *p); Node *make_node() { Node *n = (Node *)malloc(sizeof(Node)); n->num = -1; n->left = NULL; n->right = NULL; return n; } __code loop(Ds *ds) { if (ds->i < ds->size) { goto insert(ds, ds->root); } print_nodes(ds->root); exit(0); } __code insert(Ds *ds, Node *p) { if (p->num == -1) { p->num = ds->numbers[ds->i]; ds->i++; p->left = make_node(); p->right = make_node(); goto loop(ds); } if (p->num < ds->numbers[ds->i]) { goto insert(ds,p->left); } else { goto insert(ds,p->right); } } __code create_nodes(Ds *ds) { Node *root = make_node(); root->num = ds->numbers[ds->i]; ds->i++; root->left = make_node(); root->right = make_node(); ds->root = root; goto insert(ds, root); } void print_nodes(Node *p) { if (p->left != NULL) print_nodes(p->left); if (p->num != -1) printf("%d \n",p->num); if (p->right != NULL) print_nodes(p->right); } void free_nodes(Node *p) { if (p->left != NULL) free_nodes(p->left); if (p->right != NULL) free_nodes(p->right); free(p); } void main1(Ds *ds) { goto create_nodes(ds); } int main() { int numbers[] = {3,5,10,2,65,23,19,42,50,29,32,67,33,31,99}; int size = sizeof(numbers)/sizeof(int); Ds *ds = (Ds *)malloc(sizeof(Ds)); ds->numbers = numbers; ds->size = size; ds->i = 0; goto main1(ds); return 0; }