Advertisement
193030

DR 6.2 pochti gotova

Nov 26th, 2021
689
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.99 KB | None
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct Node
  5. {
  6.     void* data;
  7.     struct Node* one;
  8.     struct Node* two;
  9. };
  10. static struct Node* rootSavedRight;
  11.  
  12.  
  13. void prnint(void* p)
  14. {
  15.     printf("%d ", *(int*)p);
  16. }
  17.  
  18. void BTreeFlattering(struct Node* root, struct Node** head)
  19. {
  20.     static struct Node* 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 Node* newNode(int data)
  44. {
  45.     void* p = malloc(sizeof(data));
  46.     *(int*)p = data;
  47.     struct Node* t = (struct Node*)malloc(sizeof(struct Node));
  48.     t->data = p;
  49.     t->one = NULL;
  50.     t->two = NULL;
  51.     return t;
  52. }
  53.  
  54. void printList(struct Node* p)
  55. {
  56.     printf("\n");
  57.     static struct Node* 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 Node*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 Node* 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.     struct Node* head = NULL;
  90.     printf("printirame inorder \n");
  91.     inorder(root); // Принтиране на дървото в инфиксен ред
  92.  
  93.     // Преобразуване на дървото в списък
  94.     // инфиксен ред
  95.     BTreeFlattering(root, &head);
  96.  
  97.     // Свързване на последния с първия елемент на списъка,
  98.     // за да стане цикличен
  99.     rootSavedRight->two = head;
  100.     head->one = rootSavedRight;
  101.  
  102.     // Принтиране на цикличния списък
  103.     printList(head);;
  104. }
  105.  
Advertisement
RAW Paste Data Copied
Advertisement