Advertisement
Guest User

calosc

a guest
Mar 29th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.59 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. typedef struct node
  5. {
  6.     int nr;
  7.     struct node *nast;
  8.     struct node *nastl;
  9.     struct node *prev;
  10.     struct node *rodzic;
  11.     struct node *ost;
  12. }node;
  13.  
  14. typedef node *tree;
  15.  
  16. int n;
  17. tree t;
  18. tree tab[];
  19. void delete_subtree_pom(tree tmp2);
  20.  
  21. void ADD_NODE(int k)
  22. {
  23.     tree nowy;
  24.     tree dany;
  25.     tree poprz;
  26.     dany=tab[k];
  27.     nowy=malloc(sizeof(node));
  28.     if(dany->nast==NULL)
  29.     {
  30.         dany->nast=nowy;
  31.         dany->ost=nowy;
  32.         nowy->rodzic=dany;
  33.         nowy->prev=NULL;
  34.         nowy->nast=NULL;
  35.         nowy->nastl=NULL;
  36.         ++n;
  37.         nowy->nr=n;
  38.         tab[n]=nowy;
  39.         printf("OK\n");
  40.     }
  41.     else
  42.     {
  43.         poprz=dany->nast;
  44.         nowy->prev=poprz;
  45.         nowy->rodzic=dany;
  46.         dany->nast=nowy;
  47.         poprz->nastl=nowy;
  48.         if(dany->ost!=poprz)
  49.             poprz->rodzic=NULL;
  50.         ++n;
  51.         nowy->nr=n;
  52.         nowy->nast=NULL;
  53.         nowy->nastl=NULL;
  54.         tab[n]=nowy;
  55.         printf("OK\n");
  56.     }
  57. }
  58.  
  59. int RIGHTMOST_CHILD(int k)
  60. {
  61.     tree tmp;
  62.     tmp=tab[k];
  63.     if(tmp->nast==NULL)
  64.     {
  65.         printf("-1\n");
  66.         return -1;
  67.     }
  68.     else
  69.     {
  70.         printf("%d\n", tmp->nast->nr);
  71.         return tmp->nast->nr;
  72.     }
  73. }
  74.  
  75. void DELETE_NODE(int k)
  76. {
  77.     tree dany;
  78.     tree next;
  79.     tree tmp;
  80.     tree ojciec;
  81.     tree poprz;
  82.     tree nextl;
  83.     tree ostatni;
  84.     dany=tab[k];
  85.     if(dany->nast!=NULL)
  86.     {
  87.         next=dany->nast;
  88.         ostatni=dany->ost;
  89.         if(dany->nastl==NULL && dany->prev==NULL)
  90.         {
  91.             ojciec=dany->rodzic;
  92.             if(next!=ostatni)
  93.             {
  94.                 ojciec->nast=next;
  95.                 ojciec->ost=ostatni;
  96.                 next->rodzic=ojciec;
  97.                 ostatni->rodzic=ojciec;
  98.             }
  99.             else
  100.             {
  101.                 ojciec->nast=next;
  102.                 ojciec->ost=ostatni;
  103.                 next->rodzic=ojciec;
  104.             }
  105.         }
  106.         else if(dany->nastl==NULL)
  107.         {
  108.             poprz=dany->prev;
  109.             poprz->nastl=ostatni;
  110.             ostatni->prev=poprz;
  111.             ojciec=dany->rodzic;
  112.             ojciec->nast=next;
  113.             next->rodzic=ojciec;
  114.         }
  115.         else if(dany->prev==NULL)
  116.         {
  117.             nextl=dany->nastl;
  118.             next->nastl=nextl;
  119.             nextl->prev=next;
  120.             ojciec=dany->rodzic;
  121.             ojciec->ost=ostatni;
  122.             ostatni->rodzic=ojciec;
  123.         }
  124.         else
  125.         {
  126.             poprz=dany->prev;
  127.             nextl=dany->nastl;
  128.             nextl->prev=next;
  129.             next->nastl=nextl;
  130.             poprz->nastl=ostatni;
  131.             ostatni->prev=poprz;
  132.         }
  133.     }
  134.     else
  135.     {
  136.         if(dany->nastl==NULL && dany->prev==NULL && dany->rodzic!=NULL)
  137.         {
  138.             ojciec=dany->rodzic;
  139.             ojciec->nast=NULL;
  140.             ojciec->ost=NULL;
  141.         }
  142.         else if(dany->nastl==NULL && dany->rodzic!=NULL)
  143.         {
  144.             ojciec=dany->rodzic;
  145.             poprz=dany->prev;
  146.             ojciec->nast=poprz;
  147.             poprz->rodzic=ojciec;
  148.             poprz->nastl=NULL;
  149.         }
  150.         else if(dany->prev==NULL && dany->rodzic!=NULL)
  151.         {
  152.             ojciec=dany->rodzic;
  153.             nextl=dany->nastl;
  154.             nextl->prev=NULL;
  155.             ojciec->ost=nextl;
  156.             nextl->rodzic=ojciec;
  157.         }
  158.         else if(dany->prev!=NULL && dany->nastl!=NULL)
  159.         {
  160.             poprz=dany->prev;
  161.             nextl=dany->nastl;
  162.             poprz->nastl=nextl;
  163.             nextl->prev=poprz;
  164.         }
  165.     }
  166.     free(dany);
  167.     printf("OK\n");
  168. }
  169.  
  170. void DELETE_SUBTREE(int k)
  171. {
  172.     tree dany;
  173.     tree tmp;
  174.     tree ojciec;
  175.     tree poprz;
  176.     tree nextl;
  177.     dany=tab[k];
  178.     if(dany->nast!=NULL)
  179.     {
  180.         tmp=dany->nast;
  181.         delete_subtree_pom(tmp);
  182.     }
  183.     if(dany->nastl==NULL && dany->prev==NULL && dany->rodzic!=NULL)
  184.     {
  185.         ojciec=dany->rodzic;
  186.         ojciec->nast=NULL;
  187.         ojciec->ost=NULL;
  188.     }
  189.     else if(dany->nastl==NULL && dany->rodzic!=NULL)
  190.     {
  191.         ojciec=dany->rodzic;
  192.         poprz=dany->prev;
  193.         ojciec->nast=poprz;
  194.         poprz->rodzic=ojciec;
  195.         poprz->nastl=NULL;
  196.     }
  197.     else if(dany->prev==NULL && dany->rodzic!=NULL)
  198.     {
  199.         ojciec=dany->rodzic;
  200.         nextl=dany->nastl;
  201.         nextl->prev=NULL;
  202.         ojciec->ost=nextl;
  203.         nextl->rodzic=ojciec;
  204.     }
  205.     else if(dany->prev!=NULL && dany->nastl!=NULL)
  206.     {
  207.         poprz=dany->prev;
  208.         nextl=dany->nastl;
  209.         poprz->nastl=nextl;
  210.         nextl->prev=poprz;
  211.     }
  212.     free(dany);
  213.     if(k!=0)
  214.         printf("OK\n");
  215. }
  216.  
  217. void delete_subtree_pom(tree tmp)
  218. {
  219.     tree tmp2;
  220.     tree ojciec;
  221.     if(tmp->nast!=NULL)
  222.     {
  223.         tmp2=tmp->nast;
  224.         delete_subtree_pom(tmp2);
  225.     }
  226.     if(tmp->prev!=NULL)
  227.     {
  228.         tmp2=tmp->prev;
  229.         delete_subtree_pom(tmp2);
  230.     }
  231.     if(tmp->nastl==NULL)
  232.     {
  233.         ojciec=tmp->rodzic;
  234.         ojciec->nast=NULL;
  235.         ojciec->ost=NULL;
  236.         free(tmp);
  237.     }
  238.     else
  239.     {
  240.         ojciec=tmp->rodzic;
  241.         tmp2=tmp->nastl;
  242.         tmp2->prev=NULL;
  243.         ojciec->ost=tmp2;
  244.         tmp2->rodzic=ojciec;
  245.         free(tmp);
  246.     }
  247. }
  248.  
  249. void SPLIT_NODE(int k, int w)
  250. {
  251.     tree nowy;
  252.     tree danyw=tab[k];
  253.     tree danypop=tab[w];
  254.     tree tmp;
  255.     tree tmp2;
  256.     if(danypop->nastl==NULL)
  257.     {
  258.         ADD_NODE(k);
  259.     }
  260.     else
  261.     {
  262.         nowy=malloc(sizeof(node));
  263.         tmp=danypop->nastl;
  264.         tmp->prev=NULL;
  265.         danypop->nastl=nowy;
  266.         nowy->nastl=NULL;
  267.         nowy->prev=danypop;
  268.         nowy->rodzic=danyw;
  269.         tmp->rodzic=nowy;
  270.         nowy->ost=tmp;
  271.         if(tmp->nastl==NULL)
  272.         {
  273.             nowy->nast=tmp;
  274.         }
  275.         else
  276.         {
  277.             tmp2=danyw->nast;
  278.             tmp2->rodzic=nowy;
  279.             nowy->nast=tmp2;
  280.         }
  281.         danyw->nast=nowy;
  282.         ++n;
  283.         nowy->nr=n;
  284.         tab[n]=nowy;
  285.         printf("OK\n");
  286.     }
  287. }
  288. //***************************************
  289. #ifndef DRZEWO_H
  290. #define DRZEWO_H
  291.  
  292. typedef struct node
  293. {
  294.     int nr;
  295.     struct node *nast;
  296.     struct node *nastl;
  297.     struct node *prev;
  298.     struct node *rodzic;
  299.     struct node *ost;
  300. }node;
  301.  
  302. typedef node *tree;
  303.  
  304. extern int n;
  305.  
  306. extern tree t;
  307.  
  308. extern tree tab[];
  309.  
  310. extern void delete_subtree_pom(tree tmp2);
  311.  
  312. extern void ADD_NODE(int k);
  313.  
  314. extern int RIGHTMOST_CHILD(int k);
  315.  
  316. extern void DELETE_NODE(int k);
  317.  
  318. extern void DELETE_SUBTREE(int k);
  319.  
  320. extern void SPLIT_NODE(int k, int w);
  321.  
  322. #endif /* DRZEWO_H */
  323. //***************************************************
  324. #include <stdio.h>
  325. #include<stdlib.h>
  326.  
  327. #include "drzewo.h"
  328.  
  329. int main(void)
  330. {
  331.     char nazwa;
  332.     int numer;
  333.     int pop;
  334.     t=malloc(sizeof(node));
  335.     t->nr=0;
  336.     tab[0]=t;
  337.     n=0;
  338.     t->nast=NULL;
  339.     t->nastl=NULL;
  340.     t->prev=NULL;
  341.     t->rodzic=NULL;
  342.     while(scanf("%s %d", &nazwa, &numer)==2)
  343.     {
  344.         if((&nazwa)=="ADD_NODE")
  345.         {
  346.             ADD_NODE(numer);
  347.         }  
  348.         else if((&nazwa)=="RIGHTMOST_CHILD")
  349.         {
  350.             RIGHTMOST_CHILD(numer);
  351.         }
  352.         else if((&nazwa)=="DELETE_NODE")
  353.         {
  354.             DELETE_NODE(numer);
  355.         }
  356.         else if((&nazwa)=="DELETE_SUBTREE")
  357.         {
  358.             DELETE_SUBTREE(numer);
  359.         }
  360.         else if((&nazwa)=="SPLIT_NODE")
  361.         {
  362.             scanf(" %d", &pop);
  363.             SPLIT_NODE(numer, pop);
  364.         }
  365.     }
  366.     DELETE_SUBTREE(0);
  367.     return 0;
  368. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement