Advertisement
Guest User

Untitled

a guest
May 26th, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.63 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #define LINE_WIDTH 70
  3. #pragma once
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <queue>
  8. #include <iostream>
  9. #include <math.h>
  10.  
  11.  
  12. struct tree {
  13. int key;
  14. char fullName[100];
  15. tree *left, *right;
  16. };
  17.  
  18.  
  19. void printLevelOrder(tree *, int);
  20. tree *makeTree(tree*);
  21. tree *list(int, char*);
  22. tree *makeNode(tree*, int, char*);
  23. tree *find(tree*, int);
  24. tree *del(tree**, int);
  25. void exercise(tree**);
  26. void printNode(tree*);
  27. void dellAll(tree*);
  28. void menu();
  29. int countLevels(tree*);
  30. int countNodes(tree*);
  31. int countLeaves(tree*);
  32. void nachaloraboty();
  33.  
  34.  
  35.  
  36. int main()
  37. {
  38. menu();
  39. nachaloraboty();
  40. }
  41.  
  42. int maxLevel = 0;
  43. int curLevel = 0;
  44.  
  45. void menu() {
  46. printf("1) Make tree\n"
  47. "2) Enter new note\n"
  48. "3) Find a note\n"
  49. "4) Del the note\n"
  50. "5) Print the tree\n"
  51. "6) Do the exercise\n"
  52. "7) Exit\n");
  53. }
  54.  
  55. void nachaloraboty()
  56. {
  57. tree *root = NULL;
  58. int choice, k;
  59. char fN[100];
  60. printf("Enter your choice: ");
  61. scanf("%i", &choice);
  62. while (choice != 7) {
  63. switch (choice) {
  64. case 1:
  65. system("cls");
  66. menu();
  67. root = makeTree(root);
  68. break;
  69. case 2:
  70. system("cls");
  71. menu();
  72. if (root == NULL) {
  73. printf("\nThe tree isn't exist\n");
  74. break;
  75. }
  76. else {
  77. printf("\nEnter key: ");
  78. scanf("%i", &k);
  79. getchar();
  80. printf("Enter fullname: ");
  81. gets_s(fN);
  82. makeNode(root, k, fN);
  83. }
  84. break;
  85. case 3:
  86. system("cls");
  87. menu();
  88. if (root != NULL) {
  89. printf("\nEnter the search key: ");
  90. scanf("%i", &k);
  91. find(root, k);
  92. }
  93. else
  94. printf("\nThe tree isn't exist\n");
  95. break;
  96. case 4:
  97. system("cls");
  98. menu();
  99. if (root != NULL) {
  100. printf("\nEnter the key of the note to be deleted: ");
  101. scanf("%i", &k);
  102. del(&root, k);
  103. }
  104. else
  105. printf("\nThe tree isn't exist\n");
  106. break;
  107. case 5:
  108. system("cls");
  109. menu();
  110. curLevel = 0;
  111. maxLevel = 0;
  112. if (root != NULL) {
  113. printLevelOrder(root, countLevels(root));
  114. }
  115. else printf("\nThe tree isn't exist\n");
  116. break;
  117. case 6:
  118. system("cls");
  119. menu();
  120. if (root != NULL)
  121. printf("%d\n", countLeaves(root));
  122. else
  123. printf("\nThe tree isn't exist\n");
  124. break;
  125. default:
  126. printf("Invalid choice\n");
  127. break;
  128. }
  129. printf("\nEnter your choice: ");
  130. scanf("%i", &choice);
  131. }
  132. dellAll(root);
  133.  
  134. }
  135.  
  136. tree *makeTree(tree *rootNode)
  137. {
  138. int inf;
  139. char choice = 'y';
  140. char fullName[100];
  141. if (rootNode == NULL) {
  142. printf("\nInput root:\n");
  143. printf("Key: ");
  144. scanf("%i", &inf);
  145. getchar();
  146. printf("Fullname: ");
  147. gets_s(fullName);
  148. rootNode = list(inf, fullName);
  149. }
  150. while (1) {
  151. printf("Do you want enter the new info(y/n)?\n");
  152. scanf("%c", &choice);
  153. if (choice != 'y' && choice != 'Y') break;
  154. printf("\nInput leaf:\n");
  155. printf("Key: ");
  156. scanf("%i", &inf);
  157. printf("Fullname: ");
  158. getchar();
  159. gets_s(fullName);
  160. makeNode(rootNode, inf, fullName);
  161. }
  162. return rootNode;
  163. }
  164.  
  165. tree *list(int value1, char *value2)
  166. {
  167. tree *newNode = (tree *)malloc(sizeof(tree));// выделяем память для нового узла дерева и инициализируем его.
  168. newNode->key = value1;
  169. strcpy(newNode->fullName, value2);// инициализируем его поля
  170. newNode->left = newNode->right = NULL;// устанавливаем указатели на левое и правое деревья NULL
  171. return newNode;
  172. }
  173.  
  174. tree *makeNode(tree *r, int val1, char *val2)
  175. {
  176. tree *cur = r, *prev = NULL;
  177. int find = 0;
  178. while (cur && !find) {
  179. prev = cur;
  180. if (cur->key == val1) {
  181. printf("The note with key(%i) already exist\n", val1);
  182. find = 1;
  183. }
  184. else
  185. if (val1 < cur->key) cur = cur->left;
  186. else cur = cur->right;
  187. }
  188. if (!find) {
  189. cur = list(val1, val2);
  190. if (val1 < prev->key) prev->left = cur;
  191. else prev->right = cur;
  192. }
  193. return cur;
  194. }
  195.  
  196. tree *find(tree *rootPtr, int keyF)
  197. {
  198. while (rootPtr != NULL && rootPtr->key != keyF) {
  199. if (keyF > rootPtr->key) rootPtr = rootPtr->right;
  200. else rootPtr = rootPtr->left;
  201. }
  202. if (rootPtr != NULL) {
  203. printf("Key: %i\n", rootPtr->key);
  204. printf("Fullname: ");
  205. puts(rootPtr->fullName);
  206. }
  207. else
  208. printf("The note with key(%i) isn't find\n", keyF);
  209. return rootPtr;
  210. }
  211.  
  212. void dellAll(tree *delNode)
  213. {
  214. if (delNode != NULL) {
  215. dellAll(delNode->left);
  216. dellAll(delNode->right);
  217. free(delNode);
  218. }
  219. }
  220.  
  221. tree *del(tree **search_tree, int item)
  222. {
  223. tree *delNode, *prevDel, *cur, *prevCur;
  224. delNode = *search_tree;
  225. prevDel = NULL;
  226. while (delNode != NULL && delNode->key != item) {
  227. prevDel = delNode;
  228. if (item > delNode->key) delNode = delNode->right;
  229. else delNode = delNode->left;
  230. }
  231. if (delNode == NULL) {
  232. printf("\nNo note with this key(%i)\n", item);
  233. return *search_tree;
  234. }
  235. else if (delNode->right == NULL) cur = delNode->left;
  236. else if (delNode->left == NULL) cur = delNode->right;
  237. else {
  238. prevCur = delNode;
  239. cur = delNode->left;
  240. while (cur->right != NULL) {
  241. prevCur = cur;
  242. cur = cur->right;
  243. }
  244. if (prevCur == delNode) cur->right = delNode->right;
  245. else {
  246. cur->right = delNode->right;
  247. prevCur->right = cur->left;
  248. cur->left = delNode->left;
  249. }
  250. }
  251. if (delNode == *search_tree) {
  252. printf("\nThe note is deleted:\n");
  253. printNode(*search_tree);
  254. *search_tree = cur;
  255. return *search_tree;
  256. }
  257. else if (delNode->key < prevDel->key) prevDel->left = cur;
  258. else prevDel->right = cur;
  259. printf("\nThe note is deleted:\n");
  260. printNode(delNode);
  261. free(delNode);
  262. return cur;
  263. }
  264.  
  265. void printNode(tree *node)
  266. {
  267. printf("Key: %i\n", node->key);
  268. printf("Fullname: ");
  269. puts(node->fullName);
  270. }
  271.  
  272. int countLeaves(tree *node)
  273. {
  274. if (!node)
  275. return 0;
  276. if (!node->left && !node->right)
  277. return 1;
  278. return countLeaves(node->left) + countLeaves(node->right);
  279. }
  280.  
  281.  
  282. int countLevels(tree *root)
  283. {
  284. if (root) {
  285. curLevel++;
  286. countLevels(root->left);
  287. if (curLevel > maxLevel) maxLevel = curLevel;
  288. countLevels(root->right);
  289. if (curLevel > maxLevel) maxLevel = curLevel;
  290. curLevel--;
  291. }
  292. return maxLevel;
  293. }
  294.  
  295. void printLevelOrder(tree *root, int mLevel)
  296. {
  297.  
  298. tree *tmp = (tree *)malloc(sizeof(tree));
  299. tmp->key = 0;
  300. tmp->fullName[0] = '\0';
  301. tmp->left = NULL;
  302. tmp->right = NULL;
  303. int nNodes = 0;
  304. for (int i = 0; i < mLevel; i++)
  305. nNodes += (int)pow(2, i);
  306. int *ar = (int *)malloc(nNodes*sizeof(int));
  307. char **ar2 = (char **)malloc(nNodes*sizeof(char*));
  308. for (int i = 0; i < nNodes; i++)
  309. ar2[i] = (char*)malloc(100 * sizeof(char));
  310. if (root == NULL) return;
  311. std::queue<tree *> q;
  312. q.push(root);
  313. int v = 0, lv = 1;
  314. while (1) {
  315.  
  316. int nodeCount = q.size();
  317. if (nodeCount == 0) break;
  318.  
  319. while (nodeCount > 0) {
  320. tree *node = q.front();
  321. ar[v] = node->key;
  322. ar2[v] = node->fullName;
  323. v++;
  324. q.pop();
  325. if (node->left != NULL)
  326. q.push(node->left);
  327. else if (lv != mLevel)
  328. q.push(tmp);
  329. if (node->right != NULL)
  330. q.push(node->right);
  331. else if (lv != mLevel)
  332. q.push(tmp);
  333. nodeCount--;
  334. }
  335. lv++;
  336. }
  337.  
  338.  
  339. int *print_pos = (int *)malloc(nNodes*sizeof(int));
  340. int i, j, k, pos, x = 1, level = 0;
  341. print_pos[0] = 0;
  342. for (i = 0, j = 1; i<v; i++, j++) {
  343. pos = (int)(print_pos[((i - 1) / 2)] + (i % 2 ? -1 : 1)*(LINE_WIDTH / (pow(2, level + 1)) + 1));//считаем, скольо нужно пробелов
  344.  
  345. for (k = 0; k < pos - x; k++) printf("%c", i == 0 || i % 2 ? ' ' : '-');//печатать пробел или -?
  346. if (ar[i])
  347. printf("%d %s", ar[i], ar2[i]);
  348.  
  349. print_pos[i] = x = pos + 1;
  350. if (j == pow(2, level)) {
  351. printf("\n");
  352. level++;
  353. x = 1;
  354. j = 0;
  355. }
  356. }
  357. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement