Delegates.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdbool.h>
  4. struct Delegates
  5. {
  6. int value;
  7. struct Delegates* next;
  8. };
  9. typedef struct Delegates ListElement;
  10. typedef ListElement* List;
  11. List create(int n) {
  12. List tmp = (List)malloc(sizeof(ListElement));
  13. tmp->value = 1;
  14. tmp->next = NULL;
  15. List list = tmp, next;
  16. for (size_t i = 1; i < n; i++) {
  17. next = (List)malloc(sizeof(ListElement));
  18. list->next = next;
  19. next->value = i+1;
  20. list = next;
  21. }
  22. list->next = NULL;
  23. return tmp;
  24. }
  25. void listprint(List list) {
  26. while (list) {
  27. printf("%d ", list->value);
  28. list = list->next;
  29. }
  30. printf("\n");
  31. }
  32. List remove_all(List head) {
  33. while (head) {
  34. List p = head;
  35. head = head->next;
  36. free(p);
  37. }
  38. return NULL;
  39. }
  40. List remove_element(int data, List head) {
  41. List tmp = head, p = NULL;
  42. if (head == NULL) return NULL;
  43. while (tmp && tmp->value != data) {
  44. p = tmp;
  45. tmp = tmp->next;
  46. }
  47. if (tmp == head) {
  48. tmp = tmp->next;
  49. free(head);
  50. return tmp;
  51. }
  52. if (!tmp) return head;
  53. p->next = tmp->next;
  54. free(tmp);
  55. return head;
  56. }
  57. List add_element_n_position(int data, int n, List head) {
  58. List tmp = (List)malloc(sizeof(ListElement));
  59. if (n < 2) {
  60. tmp->value = data;
  61. tmp->next = head;
  62. return tmp;
  63. }
  64. else if (n == sizeof(head)) {
  65. tmp->value = data;
  66. tmp->next = NULL;
  67. List p = head;
  68. while (p->next) p = p->next;
  69. p->next = tmp;
  70. }
  71. else {
  72. List p = head;
  73. int count = 1;
  74. while (count < n - 1 && p->next) {
  75. p = p->next;
  76. count++;
  77. }
  78. tmp->value = data;
  79. tmp->next = p->next;
  80. p->next = tmp;
  81. }
  82. return head;
  83. }
  84. List swap_elements(int data1, int data2, List head) {
  85. List check = head;
  86. int count = 0;
  87. while (check) {
  88. if (data1 == check->value || data2 == check->value) {
  89. count++;
  90. }
  91. check = check->next;
  92. }
  93. if (count != 2) {
  94. return 0;
  95. }
  96. List p = (List)malloc(sizeof(ListElement));
  97. List tmp1 = head;
  98. if (head == NULL) return NULL;
  99. while (tmp1 && tmp1->value != data1) {
  100. tmp1 = tmp1->next;
  101. }
  102. List tmp2 = head;
  103. if (head == NULL) return NULL;
  104. while (tmp2 && tmp2->value != data2) {
  105. tmp2 = tmp2->next;
  106. }
  107. p->value = tmp1->value;
  108. tmp1->value = tmp2->value;
  109. tmp2->value = p->value;
  110. return head;
  111. }
  112. int main()
  113. {
  114. system("chcp 1251>0");
  115. printf("Введите размер списка: ");
  116. int n;
  117. scanf_s("%d", &n);
  118. List head = create(n);
  119. printf("Итоговый список:\n");
  120. /*listprint(head);*/
  121. bool flag = true;
  122. while (flag) {
  123. printf("Выберите желаемое действие:\n1 - Удалить список\n2 - Вставить элемент в список\n3 - Удалить элемент списка\n4 - Поменять два элемента местами\n");
  124. int number;
  125. scanf_s("%d", &number);
  126. switch (number) {
  127. case 1: printf("Результат удаления списка:\n"); head = remove_all(head); listprint(head); flag = false; break;
  128. case 2: printf("Введите новый элемент: "); int data; scanf_s("%d", &data); printf("\nВведите позицию, на которую хотите добавить элемент: "); int pos; scanf_s("%d", &pos); head = add_element_n_position(data, pos, head); printf("\nСписок с добавленным элементом:\n"); listprint(head); flag = false; break;
  129. case 3: printf("Введите элемент, который хотите удалить: "); scanf_s("%d", &data); head = remove_element(data, head); printf("Список с удалённым элементом:\n"); listprint(head); flag = false; break;
  130. case 4: printf("Введите первый элемент: "); int data1; scanf_s("%d", &data1); printf("Введите второй элемент: "); int data2; scanf_s("%d", &data2); head = swap_elements(data1, data2, head); printf("Список с изменёнными позициями элементов:\n"); listprint(head); flag = false; break;
  131. default: printf("Такого действия не существует, повторите ввод\n"); break;
  132. }
  133. }
  134. return 0;
  135. }