Advertisement
Guest User

Untitled

a guest
May 28th, 2015
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.21 KB | None | 0 0
  1. #include <stdio.h>
  2. //создаем структуру элемента
  3. typedef struct _elem
  4. {
  5. int data;
  6. struct _elem *prev;
  7. struct _elem *next;
  8. }
  9. elem;
  10.  
  11. typedef struct{
  12. int size;
  13. elem *head;
  14. elem *tail;
  15. }list;
  16.  
  17.  
  18.  
  19. //прототипы функций
  20. list* create_list();
  21. elem* create_elem();
  22. void add_head(list*, int );
  23. void add_tail(list*, int );
  24. void add_elem(list*, int , int );
  25. void del_head(list* );
  26. void del_tail(list* );
  27. void del_elem(list* , int );
  28. void printlist(list*);
  29. void turnlist(list*);
  30. elem* get_el(list*, int*);
  31. int get_size(list* );
  32. int get_head(list* );
  33. int get_tail(list* );
  34.  
  35. //создание пустого элемента
  36. elem* create_elem(){
  37. elem *r = malloc(sizeof(elem));
  38. r->prev = NULL;
  39. r->next = NULL;
  40. r->data = 0;
  41.  
  42. return r;
  43. }
  44. //создание списка
  45. list* create_list(){
  46. list *r = malloc(sizeof(list));
  47. r->size = 0;
  48. r->head = NULL;
  49. r->tail = NULL;
  50. return r;
  51. }
  52.  
  53. //добавление в начало
  54. void add_head(list *s, int x){
  55. elem *e = malloc(sizeof(elem));
  56. e->data = x;
  57. e->prev = NULL;
  58. e->next = s->head;
  59. if (s->head == NULL){
  60. s->head = s->tail = e;
  61. }
  62. else{
  63. s->head->prev = e;
  64. s->head = e;
  65. }
  66. s->size++;
  67. }
  68.  
  69. //добавление в конец
  70. void add_tail(list *s, int x){
  71. elem *e = malloc(sizeof(elem));
  72. e->data = x;
  73. e->prev = s->tail;
  74. e->next = NULL;
  75. if (s->tail == NULL){
  76. s->tail = s->head = e;
  77. }
  78. else{
  79. s->tail->next = e;
  80. s->tail = e;
  81. }
  82. s->size++;
  83. }
  84.  
  85. //взятие последнего
  86. int get_tail(list* s){
  87. return s->tail->data;
  88. }
  89.  
  90. //взятие первого
  91. int get_head(list* s){
  92. return s->head->data;
  93. }
  94.  
  95. //взятие произвольного
  96. elem* get_el(list *s, int *index){
  97. elem *p = s->head;
  98. if (index == 0){
  99. return get_head(s);
  100. }
  101. if (index == s->size - 1){
  102. return get_tail(s);
  103. }
  104. while (index>1){
  105. p = p->next;
  106. index--;
  107. }
  108. return p->data;
  109. }
  110. //добавление элемента
  111. void add_elem(list *s, int value, int index){
  112. elem *e = malloc(sizeof(elem));
  113. elem *p = s->head;
  114. if (index == 0){
  115. add_head(s, value);
  116. return;
  117. }
  118. if (s->head==s->tail){
  119. add_tail(s, value);
  120. return;
  121. }
  122. if (index == s->size - 1){
  123. add_tail(s, value);
  124. return;
  125. }
  126. while (index > 1){
  127. p = p->next;
  128. index--;
  129. }
  130. e->data = value;
  131. e->prev = p->prev;
  132. p->prev = e;
  133. e->next = p;
  134. e->prev->next = e;
  135.  
  136. s->size++;
  137.  
  138. }
  139.  
  140.  
  141. //удаление первого
  142. void del_head(list* s){
  143. elem* p=s->head->next;
  144. p->prev = NULL;
  145. s->head = p;
  146. s->size--;
  147. }
  148.  
  149. //удаление последнего
  150. void del_tail(list* s){
  151. elem* p=s->tail->prev;
  152. p->next = NULL;
  153. s->tail = p;
  154. s->size--;
  155. }
  156.  
  157. //удаление элемента
  158. void del_elem(list *s, int index){
  159. elem *p = s->head;
  160. elem *e = p->next;
  161. if (index == 0){
  162. del_head(s);
  163. return;
  164. }
  165. if (index == s->size - 1){
  166. del_tail(s);
  167. return;
  168. }
  169. while (index > 1){
  170. p = p->next + 1;
  171. index--;
  172. }
  173. p->next = p->next->next;
  174. p->next->prev = p;
  175. free(e);
  176. s->size--;
  177.  
  178. }
  179.  
  180. //вывод на экран
  181. void printlist(list *s){
  182. elem *p = s->head;
  183. while (p->next != NULL){
  184. printf("%d ", p->data);
  185. p = p->next;
  186. }
  187. if (p->next == NULL){
  188. printf("%d", p->data);
  189. printf("\n");
  190. return;
  191. }
  192.  
  193.  
  194. }
  195. //переворот
  196. void turnlist(list *s){
  197. elem *p;
  198. elem *q;
  199. elem *r;
  200. if (s == NULL){
  201. return;
  202. }
  203. if (s->head == NULL){
  204. return;
  205. }
  206. if (s->head->next == NULL){
  207. return;
  208. }
  209. p = s->head;
  210. q = s->head->next;
  211. if (get_size(s) == 1){
  212. return;
  213. }
  214. while (q!=NULL){
  215. r = q->next;
  216. q->next = p;
  217. p = q;
  218. q = r;
  219. }
  220. s->head->next = NULL;
  221. s->head = p;
  222.  
  223.  
  224. }
  225.  
  226. //взятие размера
  227. int get_size(list* s) {
  228. return s->size;
  229. }
  230.  
  231. void main(){
  232. int i = 0,j=0;
  233. list *a = create_list();
  234.  
  235.  
  236. for (i; i < 5; i++){
  237. add_elem(a,i,i);
  238. }
  239. printlist(a);
  240. del_head(a);
  241. add_tail(a, 8);
  242. add_head(a, 5);
  243. printlist(a);
  244. del_head(a);
  245. add_head(a, 100);
  246. turnlist(a);
  247. printlist(a);
  248. printf("%d\n", get_el(a, 0));
  249. printf("%d\n", get_size(a));
  250.  
  251. j = get_size(a);
  252. for (j; j > 1;j--){
  253. del_tail(a);
  254. }
  255.  
  256. printlist(a);
  257. del_head(a);
  258. printlist(a);
  259. turnlist(a);
  260. printlist(a);
  261. free(a);
  262. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement