Don't like ads? PRO users don't see any ads ;-)

Untitled

By: deviland on Jun 9th, 2012  |  syntax: None  |  size: 4.40 KB  |  hits: 25  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. dlist dlist_create ()
  2. {
  3.         dlist r = (dlist) malloc (sizeof (dlist_node));
  4.     r->next = r;
  5.     r->prev = r;
  6.     return r;
  7. }
  8.  
  9. dlist dlist_put_first (int x, dlist s)
  10. {
  11.     dlist r = (dlist) malloc (sizeof (dlist_node));
  12.     r->value = x;
  13.     r->prev = s;
  14.         r->next = s->next;
  15.         s -> next -> prev = r;
  16.         s -> next = r;
  17.     return r;
  18. }
  19.  
  20. dlist dlist_put_last (int x, dlist s)
  21. {
  22.     dlist r = (dlist) malloc (sizeof (dlist_node));
  23.     r->value = x;
  24.     r->next = s;
  25.         r->prev = s->prev;
  26.         s -> prev -> next = r;
  27.         s -> prev = r;
  28.     return r;
  29. }
  30.  
  31. void dlist_write_forward (dlist s)
  32. {
  33.         dlist z= s->next;
  34.         while ( z != s)
  35.         {
  36.                 printf("%d",z->value);
  37.                 z = z->next;
  38.                 if (z!=s)
  39.                         printf(" ");
  40.         }
  41. }
  42.  
  43. void dlist_write_backward (dlist s)
  44. {
  45.         dlist z= s->prev;
  46.         while ( z != s)
  47.         {
  48.                 printf("%d",z->value);
  49.                 z = z->prev;
  50.                 if (z!=s)
  51.                         printf(" ");
  52.         }
  53. }
  54.  
  55. void dlist_remove_first (dlist s)
  56. {
  57.         dlist t = s -> next;
  58.         s->next = t->next;
  59.         (t->next)->prev = s;
  60.         free(t);
  61. }
  62.  
  63. void dlist_remove_last (dlist s)
  64. {
  65.         dlist t = s -> prev;
  66.         s->prev = t->prev;
  67.         (t->prev)->next = s;
  68.         free(t);
  69. }
  70.  
  71. dlist dlist_find_first (int x, dlist s)
  72. {
  73.     dlist p = s->next;
  74.     if(p != NULL)
  75.     {
  76.         while(p->next != NULL)
  77.         {
  78.             if(p->value == x)
  79.                 return p;
  80.             p = p->next;
  81.         }
  82.     }
  83.     return NULL;
  84. }
  85.  
  86. dlist dlist_find_last (int x, dlist s)
  87. {
  88.     dlist p = s->prev;
  89.     if(p != NULL)
  90.     {
  91.         while(p->prev != NULL)
  92.         {
  93.             if(p->value == x)
  94.                 return p;
  95.             p = p->prev;
  96.         }
  97.     }
  98.     return NULL;
  99. }
  100.  
  101. void dlist_put_after (int x, dlist s, dlist p)
  102. {
  103.         if (p==NULL)
  104.         {
  105.                 dlist_put_first (x, s);
  106.         }
  107.         else
  108.         {
  109.                 dlist r = (dlist) malloc (sizeof (dlist_node));
  110.                 while (s !=p)
  111.                 {
  112.                         s=s->next;
  113.                 }
  114.                 r->value = x;
  115.                 r->prev = s;
  116.                 r->next = s->next;
  117.                 s -> next -> prev = r;
  118.                 s -> next = r;
  119.         }
  120. }
  121.  
  122. void dlist_put_before (int x, dlist s, dlist p)
  123. {
  124.     if (p==NULL)
  125.         {
  126.                 dlist_put_last (x, s);
  127.         }
  128.         else
  129.         {
  130.                 dlist r = (dlist) malloc (sizeof (dlist_node));
  131.                 while (s !=p)
  132.                 {
  133.                         s=s->prev;
  134.                 }
  135.                 r->value = x;
  136.                 r->next = s;
  137.                 r->prev = s->prev;
  138.                 s -> prev -> next = r;
  139.                 s -> prev = r;
  140.         }
  141. }
  142.  
  143. void dlist_remove (dlist s, dlist p)
  144. {
  145.         if (p != NULL)
  146.         {
  147.                 while (p != s->next)
  148.                         s=s->next;
  149.                 p = s->next;
  150.                 s->next = p->next;
  151.                 (p->next)->prev = s;
  152.                 free(p);
  153.         }
  154. }
  155.  
  156. void dlist_prune (int x, dlist s)
  157. {
  158.         dlist_remove(s, (dlist_find_first (x, s)));
  159. }
  160.  
  161.  
  162. void dlist_cat (dlist s, dlist u)
  163. {
  164.         dlist t=u;
  165.         u->next->prev = s->prev;
  166.         u->prev->next = s;
  167.         s->prev->next = u->next;
  168.         s->prev = u->prev;
  169.         free (t);
  170. }
  171.  
  172. void dlist_clear (dlist s)
  173. {
  174.         while(s->next != s)
  175.                 dlist_remove_first(s);
  176. }
  177.  
  178. void task_d (void)
  179. {
  180.         char op;
  181.         int value, listas=0;
  182.         dlist s[100], p=NULL;
  183.         while (fscanf (stdin, "%c", &op) != EOF)
  184.         {
  185.                 switch (op)
  186.                 {
  187.                         case 'C':
  188.                                 s[listas] = dlist_create ();
  189.                                 break;
  190.                         case 'P':
  191.                         {
  192.                                 fscanf(stdin, "%d",&value);
  193.                                 dlist_put_first (value, s[listas]);
  194.                                 break;
  195.                         }
  196.                         case 'S':
  197.                                 printf ("%d\n",dlist_size (s[listas]));
  198.                                 break;
  199.                         case 'F':
  200.                         {
  201.                                 dlist_write_forward (s[listas]);
  202.                                 printf("\n");
  203.                                 break;
  204.                         }
  205.                         case 'B':
  206.                         {
  207.                                 dlist_write_backward (s[listas]);
  208.                                 printf("\n");
  209.                                 break;
  210.                         }
  211.                         case 'L':
  212.                         {
  213.                                 fscanf(stdin, "%d",&value);
  214.                                 dlist_put_last(value, s[listas]);
  215.                                 break;
  216.                         }
  217.                         case 'R':
  218.                                 dlist_remove_first (s[listas]);
  219.                                 break;
  220.                         case 'T':
  221.                                 dlist_remove_last (s[listas]);
  222.                                 break;
  223.                         case 'D':
  224.                         {
  225.                                 fscanf(stdin, "%d",&value);
  226.                                 p=(dlist_find_first (value, s[listas]));
  227.                                 break;
  228.                         }
  229.                         case 'E':
  230.                         {
  231.                                 fscanf(stdin, "%d",&value);
  232.                                 p=(dlist_find_last (value, s[listas]));
  233.                                 break;
  234.                         }
  235.                         case 'A':
  236.                         {
  237.                                 fscanf(stdin, "%d",&value);
  238.                                 dlist_put_after (value, s[listas], p);
  239.                                 break;
  240.                         }
  241.                         case 'G':
  242.                         {
  243.                                 fscanf(stdin, "%d",&value);
  244.                                 dlist_put_before (value, s[listas], p);
  245.                                 break;
  246.                         }
  247.                         case 'Z':
  248.                         {
  249.                                 fscanf(stdin, "%d",&listas);
  250.                                 break;
  251.                         }
  252.                         case 'H':
  253.                                 dlist_remove (s[listas], p);
  254.                                 break;
  255.                         case 'I':
  256.                         {
  257.                                 fscanf(stdin, "%d",&value);
  258.                                 dlist_prune (value, s[listas]);
  259.                                 break;
  260.                         }
  261.                         case 'J':
  262.                         {
  263.                                 fscanf(stdin, "%d", &value);
  264.                                 dlist_cat (s[listas], s[value]);
  265.                                 break;
  266.                         }
  267.                         case 'M':
  268.                                 dlist_clear (s[listas]);
  269.                                 break;
  270.  
  271.                 }
  272.         }
  273. }