Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.87 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct list
  5. {
  6.    char el;
  7.    int prior;
  8.    list *next, *pred;
  9. };
  10.  
  11. struct  dline
  12. {
  13.    list *beg;
  14. };
  15.  
  16. void create(dline **d);
  17. int isEmpty(dline *d);
  18. void push(dline **d, char x, int p);
  19. int pop(dline **d, char *x);
  20.  
  21. int main()
  22. {
  23.    char x;
  24.    dline *d;
  25.    create(&d);
  26.  
  27.    push(&d, '4', 3);
  28.    push(&d, '1', 1);
  29.    push(&d, '5', 5);
  30.    push(&d, '2', 2);
  31.    push(&d, '3', 2);
  32.  
  33.    pop(&d, &x);
  34.  
  35.    return 0;
  36. }
  37.  
  38. void create(dline **d)
  39. {
  40.    *d = new dline;
  41.    (*d)->beg = NULL;
  42. }
  43.  
  44. int isEmpty(dline *d)
  45. {
  46.    return !(d->beg);
  47. }
  48.  
  49. void push(dline **d, char x, int p)
  50. {
  51.    list *h = (*d)->beg;
  52.    list *r = h;
  53.    if (isEmpty(*d))
  54.    {
  55.       h = new list;
  56.       h->next = h;
  57.       h->pred = h;
  58.       h->el = x;
  59.       h->prior = p;
  60.       (*d)->beg = h;
  61.    }
  62.    else
  63.    {
  64.       bool e = false;
  65.       if (r->next == r)
  66.       {
  67.          e = p >= r->prior ? 1 : 0;
  68.  
  69.          r->next = new list;
  70.          r->pred = r->next;
  71.          r->next->next = r;
  72.          r->next->pred = r;
  73.       }
  74.       else
  75.       {
  76.          while (r->next->prior <= p && r->next != h)
  77.             r = r->next;
  78.  
  79.          r->next->pred = new list;
  80.          r->next->pred->next = r->next;
  81.          r->next = r->next->pred;
  82.          r->next->pred = r;
  83.  
  84.          e = true;
  85.       }
  86.       r->next->el = x;
  87.       r->next->prior = p;
  88.  
  89.       (*d)->beg = e ? h : h->next;
  90.    }
  91.    
  92. }
  93.  
  94. int pop(dline **d, char *x)
  95. {
  96.    list *r = (*d)->beg;
  97.    if (!isEmpty(*d))
  98.    {
  99.       *x = r->el;
  100.       if (r->next != r)
  101.       {
  102.          list *d1, *d2;
  103.          d1 = r->next;
  104.          d2 = r->pred;
  105.          delete r;
  106.          r = d1;
  107.          r->pred = d2;
  108.          r->pred->next = r;
  109.       }
  110.       else
  111.       {
  112.          delete r;
  113.          r = NULL;
  114.       }
  115.  
  116.       (*d)->beg = r;
  117.       return 1;
  118.    }
  119.    else
  120.       return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement