Advertisement
Guest User

NODE

a guest
Nov 20th, 2018
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.25 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "tnode.h"
  4.  
  5. // stores a freeMethod function pointer in TNODE struct
  6. typedef void (*FM)(void * ptr);
  7. // stores a displayMethod function pointer in TNODE struct
  8. typedef void (*DM)(void * ptr, FILE *fp);
  9.  
  10. struct tnode {
  11.   void * value;
  12.   int debugVal;
  13.   TNODE * left;
  14.   TNODE * right;
  15.   TNODE * parent;
  16.   FM freeMethod;
  17.   DM displayMethod;
  18. };
  19.  
  20. extern TNODE * newTNODE(void * val, TNODE * l, TNODE * r, TNODE * p) {
  21.   TNODE * node = malloc(sizeof(TNODE));
  22.   if (node == NULL) {
  23.     printf("Error: memory for node not allocated.\n");
  24.   }
  25.   node->value = val;
  26.   node->left = l;
  27.   node->right = r;
  28.   node->parent = p;
  29.   node->freeMethod = 0;
  30.   node->displayMethod = 0;
  31.   node->debugVal = 0;
  32.  
  33.   return node;
  34. }
  35. // sets a node's display method
  36. extern void setTNODEdisplay(TNODE * n, void (*d)(void *value, FILE *fp)) {
  37.   n->displayMethod = d;
  38. }
  39. // sets a node's free method
  40. extern void setTNODEfree(TNODE * n, void (*f)(void *value)) {
  41.   n->freeMethod = f;
  42. }
  43. // gets the value of a node
  44. extern void * getTNODEvalue(TNODE * n) {
  45.   return n->value;
  46. }
  47. // sets a node's value
  48. extern void setTNODEvalue(TNODE * n, void * replacement) {
  49.   n->value = replacement;
  50. }
  51. // returns a node's left pointer
  52. extern TNODE * getTNODEleft(TNODE * n) {
  53.   return n->left;
  54. }
  55. // sets a node's left pointer
  56. extern void setTNODEleft(TNODE * n, TNODE * replacement) {
  57.   n->left = replacement;
  58. }
  59. // returns a node's right pointer
  60. extern TNODE * getTNODEright(TNODE * n) {
  61.   return n->right;
  62. }
  63. // sets a node's right pointer
  64. extern void setTNODEright(TNODE * n, TNODE * replacement) {
  65.   n->right = replacement;
  66. }
  67. // returns a node's parent
  68. extern TNODE * getTNODEparent(TNODE * n) {
  69.   return n->parent;
  70. }
  71. // sets a node's parent pointer
  72. extern void setTNODEparent(TNODE * n, TNODE * replacement) {
  73.   n->parent = replacement;
  74. }
  75. // If node's displayMethod == 0, address of the value is printed with a preceding ampersand
  76. // if debug level > 0, method prints an ampersand and then
  77. // address of the node immediately after displaying the value (with no intervening/following spaces)
  78. extern void displayTNODE(TNODE * n, FILE * fp) {
  79.   // case 1: displayMethod == 0 && debugVal == 0
  80.   // case 2: displayMethod == 0 && debugVal > 0
  81.   // case 3: displayMethod != 0 && debugVal == 0
  82.   // case 4: displayMethod != 0 && debugVal > 0
  83.   if (n->displayMethod == 0) {
  84.     if (n->debugVal == 0) {
  85.       // print "&valueAddress"
  86.       fprintf(fp, "&%p\n", &n->value);
  87.     }
  88.     else {
  89.       // print "&valueAddress&nodeAddress"
  90.       fprintf(fp, "&%p&%p\n", &n->value, &n);
  91.     }
  92.   }
  93.   else if (n->displayMethod != 0) {
  94.     if (n->debugVal == 0) {
  95.       // pass value to node's displayMethod
  96.       n->displayMethod(n->value, fp);
  97.     }
  98.     else {
  99.       // pass value to node's displayMethod
  100.       // print "&nodeAddress"
  101.       n->displayMethod(n->value, fp);
  102.       fprintf(fp, "&%p\n", &n);
  103.     }
  104.   }
  105. }
  106. // method sets the node's new debugVal and
  107. // returns prev. debugVal
  108. extern int debugTNODE(TNODE * n, int level) {
  109.   int prevVal = n->debugVal;
  110.   n->debugVal = level;
  111.  
  112.   return prevVal;
  113. }
  114. // frees a node
  115. extern void freeTNODE(TNODE * n) {
  116.   if (n->freeMethod) {
  117.     n->freeMethod(n->value);
  118.   }
  119.   free(n);
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement