Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.18 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef char ELEMTYPE;
  5.  
  6. typedef struct LinkedList {
  7. struct LinkedList* prev;
  8. struct LinkedList* next;
  9. ELEMTYPE elem;
  10. } Node;
  11.  
  12. typedef struct MyList {
  13. Node* header;
  14. Node* trailer;
  15. int size;
  16. } MyList;
  17.  
  18. Node* getNode()
  19. {
  20. Node* node = (Node*)malloc(sizeof(Node));
  21. node->prev = NULL;
  22. node->next = NULL;
  23. node->elem = 0;
  24.  
  25. return node;
  26. }
  27.  
  28. ELEMTYPE putNode(Node* node)
  29. {
  30. ELEMTYPE e = node->elem;
  31. free(node);
  32.  
  33. return e;
  34. }
  35.  
  36. void init(MyList* l)
  37. {
  38. l->header = getNode();
  39. l->trailer = getNode();
  40.  
  41. l->header->next = l->trailer;
  42. l->trailer->prev = l->header;
  43.  
  44. l->size = 0;
  45. }
  46.  
  47. void get(MyList* l, int r)
  48. {
  49. Node* node = l->header;
  50.  
  51. if (!(1 <= r && r <= l->size)) {
  52. printf("invalid position\n");
  53. return;
  54. }
  55.  
  56. while (r--)
  57. node = node->next;
  58. printf("%c\n", node->elem);
  59. }
  60.  
  61. void print(MyList* l)
  62. {
  63. Node* node = l->header->next;
  64.  
  65. while (node != l->trailer) {
  66. printf("%c", node->elem);
  67. node = node->next;
  68. }
  69. printf("\n");
  70. }
  71.  
  72. void add(MyList* l, int r, ELEMTYPE e)
  73. {
  74. Node* p = l->header, * newNode;
  75.  
  76. if (!(1 <= r && r <= l->size + 1)) {
  77. printf("invalid position\n");
  78. return;
  79. }
  80.  
  81. newNode = getNode();
  82. newNode->elem = e;
  83.  
  84. while (--r)
  85. p = p->next;
  86.  
  87. newNode->next = p->next;
  88. newNode->prev = p;
  89. p->next->prev = newNode;
  90. p->next = newNode;
  91.  
  92. l->size++;
  93. }
  94.  
  95. void delete(MyList* l, int r)
  96. {
  97. Node* delNode = l->header;
  98.  
  99. if (!(1 <= r && r <= l->size)) {
  100. printf("invalid position\n");
  101. return;
  102. }
  103.  
  104. while (r--)
  105. delNode = delNode->next;
  106.  
  107. delNode->prev->next = delNode->next;
  108. delNode->next->prev = delNode->prev;
  109. l->size--;
  110.  
  111. putNode(delNode);
  112. }
  113.  
  114. void deleteAll(MyList* l)
  115. {
  116. while (l->size)
  117. delete(l, 1);
  118.  
  119. putNode(l->header);
  120. putNode(l->trailer);
  121. free(l);
  122. }
  123.  
  124. int main(void)
  125. {
  126. MyList* l = (MyList*)malloc(sizeof(MyList));
  127. int N;
  128. scanf("%d%*c", &N);
  129.  
  130. init(l);
  131. while (N--)
  132. {
  133. char command, elem;
  134. int rank;
  135. scanf("%c", &command);
  136.  
  137. switch (command)
  138. {
  139. case 'A':
  140. scanf("%d %c", &rank, &elem);
  141. add(l, rank, elem);
  142. break;
  143. case 'D':
  144. scanf("%d", &rank);
  145. delete(l, rank);
  146. break;
  147. case 'G':
  148. scanf("%d", &rank);
  149. get(l, rank);
  150. break;
  151. case 'P':
  152. print(l);
  153. break;
  154. default:
  155. break;
  156. }
  157. getchar();
  158. }
  159. deleteAll(l);
  160. return 0;
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement