Advertisement
Guest User

Untitled

a guest
May 20th, 2018
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.11 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. //создаем звено
  5. typedef struct Node{
  6. void *value;
  7. struct Node *next;
  8. struct Node *prev;
  9. } Node;
  10. //создаем двусвязный список
  11. typedef struct DblLinkedList{
  12. size_t size;
  13. Node *head;
  14. Node *tail;
  15. };
  16. //добавление в конец
  17. void pushBack(DblLinkedList *list, void *data){
  18. Node *tmp = (Node*)malloc(sizeof(Node));
  19. if (tmp == NULL){
  20. exit(3);
  21. }
  22. tmp->value = data;
  23. tmp->next = NULL;
  24. tmp->prev = list->tail;
  25. if (list->tail){
  26. list->tail->next = tmp;
  27. }
  28. list->tail = tmp;
  29. if (list->head == NULL){
  30. list->head = tmp;
  31. }
  32. list->size++;
  33. }
  34. //создаем экземпляр структуры
  35. DblLinkedList* createDblLinkedList(){
  36. DblLinkedList *tmp = (DblLinkedList*)malloc(sizeof(DblLinkedList));
  37. tmp->size = 0;
  38. tmp->head = tmp->tail = NULL;
  39. return tmp;
  40. }
  41. //удаляем структуру
  42. void DeleteDblLinkedList(DblLinkedList **list){
  43. Node *tmp = (*list)->head;
  44. Node *next = NULL;
  45. while (tmp){
  46. next = tmp->next;
  47. free(tmp);
  48. tmp = next;
  49. }
  50. free(*list);
  51. (*list) = NULL;
  52. }
  53. //получение н-ого ??
  54. Node* getNthq (DblLinkedList *list, size_t index){
  55. Node *tmp = NULL;
  56. size_t i;
  57. if (index < list->size / 2){
  58. i = 0;
  59. tmp = list->head;
  60. while(tmp && i < index){
  61. tmp = tmp ->next;
  62. i++;
  63. }
  64. } else {
  65. i = list->size - 1;
  66. tmp = list ->tail;
  67. while(tmp && i > index){
  68. tmp = tmp->prev;
  69. i--;
  70. }
  71. }
  72. return tmp;
  73. }
  74. //удаление из н-ого места
  75. void* deleteNth(DblLinkedList *list, size_t index){
  76. Node *elm = NULL;
  77. void *tmp = NULL;
  78. elm = getNthq(list, index);
  79. if (elm == NULL){
  80. exit(1);
  81. }
  82. if (elm->prev){
  83. elm->prev->next = elm->next;
  84. }
  85. if (elm->next){
  86. elm->next->prev = elm->prev;
  87. }
  88. if (!elm->prev){
  89. list->head = elm->next;
  90. }
  91. if (!elm->next){
  92. list->tail = elm->prev;
  93. }
  94. free(elm);
  95. list->size--;
  96. return tmp;
  97. }
  98. // Удаление введеного с клавиатуры
  99. Node* getNth(DblLinkedList *list, void* n) {
  100. Node *tmp = list->head;
  101. size_t i = 0;
  102. while (tmp) {
  103. if (*((float*)tmp->value) != *((float*)(n))){
  104. tmp = tmp->next;
  105. i++;
  106. } else {
  107. Node *tmp2 = tmp->next;
  108. deleteNth(list, i);
  109. if (!tmp2){
  110. break;
  111. }
  112. tmp = tmp2->next;
  113. i++;
  114. //break;
  115. }
  116. }
  117. return tmp;
  118. }
  119.  
  120. //печать
  121. void printDblLinkedList(DblLinkedList *list, void (*fun)(void*)) {
  122. Node *tmp = list->head;
  123. while (tmp){
  124. fun(tmp->value);
  125. tmp = tmp->next;
  126. }
  127. cout<<endl;
  128. }
  129. void printFloat (void *value){
  130. cout<<*(float*) value<<" ";
  131. }
  132. //создание списка из массива
  133. DblLinkedList* fromArray(void *arr, size_t n, size_t size) {
  134. DblLinkedList *tmp = NULL;
  135. size_t i = 0;
  136. if (arr == NULL){
  137. exit(2);
  138. }
  139. tmp = createDblLinkedList();
  140. while (i < n){
  141. pushBack(tmp, ((char*)arr+i*size));
  142. return tmp;
  143. }
  144. }
  145.  
  146. int main() {
  147. DblLinkedList *list = createDblLinkedList();
  148. float a, b, c, d, e, f,g;
  149.  
  150. a = 10;
  151. b = 20;
  152. c = 30;
  153. d = 40;
  154. e = 50;
  155. f = 60;
  156. g = 0;
  157. pushBack(list, &a);
  158. pushBack(list, &b);
  159. pushBack(list, &c);
  160. pushBack(list, &d);
  161. pushBack(list, &e);
  162. pushBack(list, &f);
  163. printDblLinkedList(list, printFloat);
  164. cout<<"Vvedi chislo: ";
  165. cin>>g;
  166. getNth(list, &g);
  167. printDblLinkedList(list, printFloat);
  168. cout<<"length "<<list->size<<endl;
  169. cout<<"head "<<*((float*)(list->head->value))<<endl;
  170. cout<<"tail "<<*((float*)(list->tail->value))<<endl;
  171. DeleteDblLinkedList(&list);
  172. /*char c;
  173. float a;
  174. for (;;) {
  175. cout << "Vvesti element? (y/n) ";
  176. cin>>c;
  177. if (c == 'n') break;
  178. cout << "Vvedite chislo tipa float: ";
  179. cin >> a;
  180. pushBack(list, &a);
  181. } */
  182.  
  183.  
  184.  
  185.  
  186. return 0;
  187.  
  188. }
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211. /*float a, b, c, d, e, f, g, h;
  212.  
  213. a = 10.3;
  214. b = 20.9;
  215. c = 30.5;
  216. d = 40.6;
  217. e = 50.7;
  218. f = 60.8;
  219. g = 70.9;
  220. h = 80.4;
  221. pushBack(list, &d);
  222. pushBack(list, &e);
  223. pushBack(list, &f);
  224. printDblLinkedList(list, printFloat);
  225. cout<<"length "<<list->size<<endl;
  226. cout<<"nth 2 "<<*((float*)(getNthq(list, 2))->value)<<endl;
  227. cout<<"nth 5 "<<*((float*)(getNthq(list, 5))->value)<<endl;
  228. cout<<"head "<<*((float*)(list->head->value))<<endl;
  229. cout<<"tail "<<*((float*)(list->tail->value))<<endl;
  230. cout<<"legth "<<list->size<<endl;
  231. printDblLinkedList(list, printFloat);
  232. printDblLinkedList(list, printFloat);
  233. deleteNth(list, 0);
  234. printDblLinkedList(list, printFloat);
  235. DeleteDblLinkedList(&list); */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement