baum

diff baum.c @ 1:3da0ff17c8e7

added features (print, sum, number); split in header file
author meillo@marmaro.de
date Thu, 07 Feb 2008 14:31:02 +0100
parents 2f71d692d4f9
children 557fa4df2bcd
line diff
     1.1 --- a/baum.c	Thu Feb 07 12:51:54 2008 +0100
     1.2 +++ b/baum.c	Thu Feb 07 14:31:02 2008 +0100
     1.3 @@ -9,18 +9,21 @@
     1.4  
     1.5  #include <stdio.h>
     1.6  #include <stdlib.h>
     1.7 +#include <string.h>
     1.8  
     1.9 +#include "baum.h"
    1.10  
    1.11 -struct Node {
    1.12 -	char* name;
    1.13 -	char value;
    1.14 -	struct Node* down;
    1.15 -	struct Node* right;
    1.16 -};
    1.17 +char action(struct Node* node);
    1.18  
    1.19  struct Node* root;
    1.20  
    1.21  
    1.22 +void logit(char* text) {
    1.23 +	fprintf(stderr, "[%s]\n", text);
    1.24 +}
    1.25 +
    1.26 +
    1.27 +/* new */
    1.28  struct Node* newNode(char* name) {
    1.29  	struct Node* node;
    1.30  	node = (struct Node*) malloc(sizeof(struct Node));
    1.31 @@ -31,40 +34,105 @@
    1.32  	return node;
    1.33  }
    1.34  
    1.35 -void init() {
    1.36 -	root = newNode("print");
    1.37 -	root->down = newNode("sum");
    1.38 -}
    1.39  
    1.40 -void cleanup(struct Node* node) {
    1.41 +/* delete */
    1.42 +void delete(struct Node* node) {
    1.43  	if (node->down != NULL) {
    1.44 -		cleanup(node->down);
    1.45 +		delete(node->down);
    1.46  	}
    1.47  	if (node->right != NULL) {
    1.48 -		cleanup(node->right);
    1.49 +		delete(node->right);
    1.50  	}
    1.51  	free(node); node=0;
    1.52  }
    1.53  
    1.54 +
    1.55 +/* print */
    1.56  void printNode(struct Node* node) {
    1.57  	printf("Node: %20s (%c)\n", node->name, node->value);
    1.58  }
    1.59  
    1.60  void printTree(struct Node* root) {
    1.61  	printNode(root);
    1.62 +	printf("  down: ");
    1.63  	if (root->down != NULL) {
    1.64  		printTree(root->down);
    1.65 +	} else {
    1.66 +		printf("NULL\n");
    1.67  	}
    1.68 +	printf("  right: ");
    1.69  	if (root->right != NULL) {
    1.70  		printTree(root->right);
    1.71 +	} else {
    1.72 +		printf("NULL\n");
    1.73  	}
    1.74  }
    1.75  
    1.76  
    1.77 +char action_print(struct Node* node) {
    1.78 +	printf("%c\n", action(node->down));
    1.79 +	return 0;
    1.80 +}
    1.81 +
    1.82 +char action_sum(struct Node* node) {
    1.83 +	struct Node* tp;
    1.84 +	tp = node->down;
    1.85 +	while (tp != NULL) {
    1.86 +		node->value += action(tp);
    1.87 +		tp = tp->right;
    1.88 +	}
    1.89 +	return node->value;
    1.90 +}
    1.91 +
    1.92 +char action_number(struct Node* node) {
    1.93 +	return node->value;
    1.94 +}
    1.95 +
    1.96 +char action(struct Node* node) {
    1.97 +	if (strcmp(node->name, "print") == 0) {
    1.98 +		logit("print-node");
    1.99 +		return action_print(node);
   1.100 +	} else if (strcmp(node->name, "sum") == 0) {
   1.101 +		logit("sum-node");
   1.102 +		return action_sum(node);
   1.103 +	} else if (strcmp(node->name, "number") == 0) {
   1.104 +		logit("number-node");
   1.105 +		return action_number(node);
   1.106 +	} else {
   1.107 +		fprintf(stderr, "unknown kind of node");
   1.108 +		exit(1);
   1.109 +	}
   1.110 +}
   1.111 +
   1.112 +
   1.113 +
   1.114 +/* traverse */
   1.115 +void traverse(struct Node* root) {
   1.116 +	/* each node controlls the nodes below itself */
   1.117 +	action(root);
   1.118 +}
   1.119 +
   1.120 +/* init */
   1.121 +void init() {
   1.122 +	root = newNode("print");
   1.123 +	root->down = newNode("number");
   1.124 +	root->down = newNode("sum");
   1.125 +	root->down->down = newNode("number");
   1.126 +	root->down->down->value = 70;  /* 'F' */
   1.127 +	root->down->down->right = newNode("number");
   1.128 +	root->down->down->right->value = 50;  /* '2' */
   1.129 +	/* result should be 'x' */
   1.130 +}
   1.131 +
   1.132 +
   1.133 +/* main */
   1.134  int main(int argc, char* argv[]) {
   1.135  	init();
   1.136  	printTree(root);
   1.137 -	cleanup(root);
   1.138 +
   1.139 +	action(root);
   1.140 +
   1.141 +	delete(root);
   1.142  	
   1.143  	return(0);
   1.144  }