view compare/tree/unbalance_binary_tree.cbc @ 24:5354e0f8f557 draft

add unbalance_binary_tree.c
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Mon, 13 Aug 2012 03:59:25 +0900
parents 13a2c13bbd0b
children adce006dc64a
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 exit0(Ds *ds);
__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 exit0(Ds *ds)
{
	print_nodes(ds->root);
	exit(0);
}

__code loop(Ds *ds)
{
	if (ds->i < ds->size) {
		goto insert(ds, ds->root);
	}
	goto ds->next(ds);
}

__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;
	ds->next = exit0;
	goto main1(ds);

	return 0;
}