Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.78 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>
  4.  
  5. const int LENGTH = 30;
  6.  
  7. struct node
  8. {
  9.     char * name;
  10.     char * number;
  11.     struct node * p;
  12.     struct node * l;
  13.     struct node * r;
  14. };
  15.  
  16. char print_str(char * str);
  17. int str_comp(char * a, char * b)
  18. {
  19.     for (int i =0; i< LENGTH; i++)
  20.     {
  21.         if(a[i]!=b[i])
  22.             if(a[i]<b[i])
  23.                 return -1;
  24.             else
  25.                 return 1;
  26.     }
  27.     return 0;
  28. }
  29.  
  30.  
  31. struct node root = NULL;
  32. int _size = 0;
  33. void init(char * name, char * number)
  34. {
  35.     root.name = name;
  36.     _size++;
  37.     root.number = number;
  38.     root.l = NULL;
  39.     root.r = NULL;
  40.     root.p = &root;
  41. }
  42. void add(struct node * f, char * name, char * number)
  43. {
  44.     if(_size==0)
  45.     {
  46.         init(name,number);
  47.         return;
  48.     }
  49.     if (str_comp(f->name, name)>0)
  50.     {
  51.         if(f->l!=NULL)
  52.         {
  53.             add(f->l, name, number);
  54.         }
  55.         else
  56.         {
  57.             struct node* new_node = (struct node*)malloc(sizeof(struct node));
  58.             _size++;
  59.             new_node->l = NULL;
  60.             new_node->r = NULL;
  61.             new_node->name = name;
  62.             new_node->number = number;
  63.             new_node->p = f;
  64.             f->l = new_node;
  65.  
  66.         }
  67.     }
  68.     else
  69.     {
  70.         if(str_comp(f->name, name)==0)
  71.         {
  72.             f->number = number;
  73.             return;
  74.         }
  75.         if(f->r!=NULL)
  76.         {
  77.             add(f->r, name, number);
  78.         }
  79.         else
  80.         {
  81.             struct node* new_node = (struct node*)malloc(sizeof(struct node));
  82.             _size++;
  83.             new_node->l=NULL;
  84.             new_node->r=NULL;
  85.             new_node->name = name;
  86.             new_node->number  = number;
  87.             new_node->p = f;
  88.             f->r = new_node;
  89.  
  90.         }
  91.     }
  92. }
  93. void add1(char * name, char *number)
  94. {
  95.     struct node * k = &root;
  96.     add(k, name, number);
  97. }
  98. void kill(struct node * f, char * name, struct node * parent)
  99. {
  100.     int cmp = str_comp(f->name, name);
  101.     if(cmp>0)
  102.     {
  103.         if(f->l==NULL)
  104.         {
  105.             printf("NO ELEMENT\n");
  106.             return;
  107.         }
  108.         kill(f->l, name, f);
  109.         return;
  110.     }
  111.     if(cmp<0)
  112.     {
  113.         if(f->r==NULL)
  114.         {
  115.             printf("NO ELEMENT\n");
  116.             return;
  117.         }
  118.         kill(f->r, name,f);
  119.         return;
  120.     }
  121.     if(f->r==NULL&&f->l==NULL)
  122.     {
  123.         if(f==&root)
  124.         {
  125.             _size=0;
  126.             return;
  127.         }
  128.         if(f->p->r==f)
  129.         {
  130.             parent->r = NULL;
  131.         }
  132.         else
  133.         {
  134.             parent->l = NULL;
  135.         }
  136.         free(f);
  137.         _size--;
  138.         return;
  139.     }
  140.  
  141.     if (f->l==NULL)
  142.     {
  143.         struct node * tmp = f->r;
  144.         f->l = tmp->l;
  145.         f->r = tmp->r;
  146.         f->name = tmp->name;
  147.         f->number = tmp->number;
  148.         free(tmp);
  149.         _size--;
  150.         return;
  151.     }
  152.     if(f->r==NULL)
  153.     {
  154.         struct node * tmp = f->l;
  155.         f->l = tmp->l;
  156.         f->r = tmp->r;
  157.         f->name = tmp->name;
  158.         f->number = tmp->number;
  159.         free(tmp);
  160.         _size--;
  161.         return;
  162.     }
  163.     struct node * tmp = f->l;
  164.     while(tmp->r!=NULL)
  165.         tmp = tmp->r;
  166.     if(tmp!=f->l)
  167.     {
  168.         struct node* parent = tmp->p;
  169.         struct node* child = tmp->l;
  170.         if(tmp->l!=NULL)
  171.             parent->r  = child;
  172.         else
  173.             parent->r = NULL;
  174.         f->name = tmp->name;
  175.         f->number = tmp->number;
  176.         free(tmp);
  177.         _size--;
  178.     }
  179.     else
  180.     {
  181.         struct node* child = tmp->l;
  182.         if(tmp->l!=NULL)
  183.             f->l  = child;
  184.         else
  185.             f->l = NULL;
  186.         f->name = tmp->name;
  187.         f->number = tmp->number;
  188.         free(tmp);
  189.         _size--;
  190.     }
  191. }
  192. void kill1(char * name)
  193. {
  194.     kill(&root, name, NULL);
  195. }
  196. void get_number(struct node * f, char * name)
  197. {
  198.     int cmp =str_comp(f->name,name);
  199.     if(cmp>0)
  200.     {
  201.         if(f->l==NULL)
  202.         {
  203.             printf("Number not found\n");
  204.             return;
  205.         }
  206.         get_number(f->l, name);
  207.         return;
  208.     }
  209.     if(cmp<0)
  210.     {
  211.         if(f->r==NULL)
  212.         {
  213.             printf("Number not found\n");
  214.             return;
  215.         }
  216.         get_number(f->r, name);
  217.         return;
  218.     }
  219.     printf("Number is ");
  220.     print_str(f->number);
  221. }
  222. void get_number1(char * name)
  223. {
  224.     get_number(&root, name);
  225. }
  226.  
  227. void dfs(struct node * f)
  228. {
  229.     if(f->l!=NULL)
  230.         dfs(f->l);
  231.     printf("=======\n");
  232.     print_str(f->name);
  233.     print_str(f->number);
  234.     _size++;
  235.     printf("=======\n");
  236.     if(f->r!=NULL)
  237.         dfs(f->r);
  238. }
  239.  
  240. void dfs1()
  241. {
  242.     if(_size==0)
  243.     {
  244.         printf("NO ELEMENTS\n");
  245.     }
  246.     else
  247.     {
  248.         _size=0;
  249.         dfs(&root);
  250.     }
  251. }
  252.  
  253. char print_str(char * str)
  254. {
  255.     for (int i =0; i<LENGTH; i++)
  256.         printf("%c",str[i]);
  257.     printf("\n");
  258. }
  259.  
  260. char * readString()
  261. {
  262.     char* arr= (char*)malloc(LENGTH*sizeof(char));
  263.     for (int  i=0; i<LENGTH; i++)
  264.         arr[i]=' ';
  265.     char ch = getchar();
  266.     int i=0;
  267.     while(ch!=' '&&ch!='\n')
  268.     {
  269.         arr[i++]=ch;
  270.         ch = getchar();
  271.     }
  272.     if(i)
  273.         return arr;
  274.     else
  275.         return readString();
  276. }
  277.  
  278. int eq(char *a, char *b)
  279. {
  280.     for (int i =0; i<3; i++)
  281.         if(a[i]!=b[i])
  282.             return 0;
  283.     return 1;
  284. }
  285.  
  286.  
  287. int main()
  288. {
  289.     char * str = readString();
  290.     while(!eq(str, "end"))
  291.     {
  292.         if(eq(str, "add"))
  293.         {
  294.             printf("name is ");
  295.             char * name = readString();
  296.             printf("number is ");
  297.             char * num = readString();
  298.             add1(name,num);
  299.         }
  300.         else if(eq(str, "del"))
  301.         {
  302.             printf("name is ");
  303.             char * name = readString();
  304.             kill1(name);
  305.             printf("done\n");
  306.         }
  307.         else if(eq(str, "get"))
  308.         {
  309.             printf("name is ");
  310.             char * name = readString();
  311.             get_number1(name);
  312.         }
  313.         else if(eq(str,"dfs"))
  314.         {
  315.             dfs1();
  316.         }
  317.         str = readString();
  318.     }
  319.  
  320.     return 0;
  321. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement