deviland

Untitled

Jun 9th, 2012
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.40 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment