Advertisement
193030

DR 6.2 rdy

Nov 27th, 2021
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.05 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct node2
  5. {
  6. void* data;
  7. struct node2* one;
  8. struct node2* two;
  9. };
  10. static struct node2* rootSavedRight;
  11.  
  12.  
  13. void prnint(void* p)
  14. {
  15. printf("%d ", *(int*)p);
  16. }
  17.  
  18. void BTreeFlattering(struct node2* root, struct node2** head)
  19. {
  20. static struct node2* prev = NULL;
  21.  
  22. if (root == NULL)
  23. {
  24. rootSavedRight = prev; // Запазваме най-крайният възел
  25. return;
  26. }
  27. BTreeFlattering(root->one, head);
  28. if (prev == NULL)
  29. {
  30. *head = root;
  31. }
  32. else
  33. {
  34. root->one = prev;
  35. prev->two = root;
  36. }
  37. prev = root;
  38.  
  39. BTreeFlattering(root->two, head);
  40. }
  41.  
  42.  
  43. struct node2* newNode(int data)
  44. {
  45. void* p = malloc(sizeof(data));
  46. *(int*)p = data;
  47. struct node2* t = (struct node2*)malloc(sizeof(struct node2));
  48. t->data = p;
  49. t->one = NULL;
  50. t->two = NULL;
  51. return t;
  52. }
  53.  
  54. void printList(struct node2* p)
  55. {
  56. printf("\n");
  57. static struct node2* root;
  58. if (root == NULL)
  59. root = p;
  60. while(p!=NULL)
  61. {
  62. prnint(p->data);
  63. p = p->two;
  64. if (p == root) // Възлите на цикъла започват да се повтарят
  65. break;
  66. }
  67. }
  68.  
  69.  
  70. void inorder(struct node2*p)
  71. {
  72. if (!p)
  73. return;
  74. inorder(p->one);
  75. prnint(p->data);
  76. inorder(p ->two);
  77. }
  78.  
  79. int main()
  80. {
  81.  
  82. struct node2* root = newNode(2);
  83. root->one = newNode(4);
  84. root->two = newNode(19);
  85. root->one->one = newNode(7);
  86. root->one->two = newNode(10);
  87. root->two->one = newNode(22);
  88. /*
  89. * 2
  90. * / \
  91. * 4 19
  92. * / \ /
  93. * 7 10 22
  94. */
  95.  
  96. struct node2* head = NULL;
  97. inorder(root); // Принтиране на дървото в инфиксен ред
  98.  
  99. // Преобразуване на дървото в списък
  100. // инфиксен ред
  101. BTreeFlattering(root, &head);
  102.  
  103. // Свързване на последния с първия елемент на списъка,
  104. // за да стане цикличен
  105. rootSavedRight->two = head;
  106. head->one = rootSavedRight;
  107.  
  108. // Принтиране на цикличния списък
  109. printList(head);
  110. }
  111.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement