int main (int argc, char *argv[]) { ASSERT (31 == ((1 << TreeHeight) - 1)); ASSERT (4096 == strlen (FarewellAddress)); XDR xdrIn, xdrOut; char buf[BufSize]; CertificateHeader header; IdentityCertificate inCert, outCert; inCert.header = header; inCert.subject = strdup (HelloWorld); outCert.subject = NULL; Torture inTorture, outTorture; inTorture.p = malloc (sizeof (uint32_t)); inTorture.t = strdup (HelloWorld); outTorture.p = NULL; outTorture.t = NULL; TreeNode *inTreeNode = treeBuild (TreeHeight), outTreeNode; xdrmem_create (&xdrIn, buf, BufSize, XDR_ENCODE); xdrmem_create (&xdrOut, buf, BufSize, XDR_DECODE); printf ("\n"); printf ("Encode benchmarks:\n"); BME ("32-bit Integer", xdrIn, Uint32, 0); BME ("64-bit Integer", xdrIn, Uint64, 0); BME ("32-bit Float", xdrIn, Float32, 0); BME ("64-bit Float", xdrIn, Float64, 0); BME ("Pointer", xdrIn, UintPtr, malloc (1)); BME ("4096-byte String", xdrIn, String, strdup(FarewellAddress)); benchmarkEncodeUint32Array (xdrIn); BME ("Certificate", xdrIn, IdentityCertificate, inCert); BME ("Torture", xdrIn, Torture, inTorture); BME ("32-node Tree", xdrIn, TreeNode, *inTreeNode); printf ("\n"); printf ("Decode benchmarks:\n"); BMD ("32-bit Integer", xdrIn, xdrOut, Uint32, 0, 0); BMD ("64-bit Integer", xdrIn, xdrOut, Uint64, 0, 0); BMD ("32-bit Float", xdrIn, xdrOut, Float32, 0, 0); BMD ("64-bit Float", xdrIn, xdrOut, Float64, 0, 0); BMD ("Pointer", xdrIn, xdrOut, UintPtr, malloc (1), NULL); BMD ("4096-byte String", xdrIn, xdrOut, String, strdup(FarewellAddress), NULL); benchmarkDecodeUint32Array (xdrIn, xdrOut); BMD ("Certificate", xdrIn, xdrOut, IdentityCertificate, inCert, outCert); BMD ("Torture", xdrIn, xdrOut, Torture, inTorture, outTorture); BMD ("32-node Tree", xdrIn, xdrOut, TreeNode, *inTreeNode, outTreeNode); xdr_destroy (&xdrIn); xdr_destroy (&xdrOut); exit (EXIT_SUCCESS); }
void treeBuild(Node **node, Stack *st) { Token token; if (stackEmpty(st)) return; token = stackTop(st); stackPop(st); (*node) = treeNodeCreate(); (*node)->_varOp = token._varOp; (*node)->_num = token._num; if (isOp((*node)->_varOp)) { treeBuild(&(*node)->_right, st); treeBuild(&(*node)->_left, st); } }
TreeNode * treeBuild (uint32_t height) { ASSERT(height > 0); static uint32_t nodeId = 0; TreeNode *node = malloc (sizeof (TreeNode)); height--; node->id = nodeId++; if (height > 0) { node->left = treeBuild (height); node->right = treeBuild (height); } else { node->left = NULL; node->right = NULL; } return node; }
int main(void) { int action; char expr[255]; Node *root = NULL, *root2 = NULL; Stack stPost; while (1) { printf("Меню:\n"); printf("1) Ввести выражение\n"); printf("2) Печать исходного выражения\n"); printf("3) Печать преобразованного выражения\n"); printf("4) Печать исходного дерева\n"); printf("5) Печать преобразованного дерева\n"); printf("6) Выход\n"); printf("Выберите действие: "); scanf("%d", &action); switch (action) { case 1: { printf("Введите выражение: "); scanf("%s", expr); treeDestroy(&root); treeDestroy(&root2); stackCreate(&stPost); postOrder(expr, &stPost); treeBuild(&root, &stPost); stackDestroy(&stPost); root2 = treeCopy(&root); treeMoveMinus(&root2); break; } case 2: { printf("Исходное выражение: %s\n", expr); break; } case 3: { LKP(&root2); printf("\n"); break; } case 4: { if (root != NULL) { printf("Дерево исходного выражения\n"); PKL(&root, 0); } else printf("Дерево исходного выражения пусто\n"); break; } case 5: { if (root2 != NULL) { printf("Дерево преобразованного выражения\n"); PKL(&root2, 0); } else printf("Дерево преобразованного выражения пусто\n"); break; } case 6: break; default: { printf("Ошибка. Такого пункта меню не существует\n"); break; } } if (action == 6) break; } treeDestroy(&root); treeDestroy(&root2); return 0; }