123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- #include <stdio.h>
- #include <malloc.h>
- #include <stdbool.h>
- struct Delegates
- {
- int value;
- struct Delegates* next;
- };
- typedef struct Delegates ListElement;
- typedef ListElement* List;
- List create(int n) {
- List tmp = (List)malloc(sizeof(ListElement));
- tmp->value = 1;
- tmp->next = NULL;
- List list = tmp, next;
- for (size_t i = 1; i < n; i++) {
- next = (List)malloc(sizeof(ListElement));
- list->next = next;
- next->value = i+1;
- list = next;
- }
- list->next = NULL;
- return tmp;
- }
-
- void listprint(List list) {
- while (list) {
- printf("%d ", list->value);
- list = list->next;
- }
- printf("\n");
- }
- List remove_all(List head) {
- while (head) {
- List p = head;
- head = head->next;
- free(p);
- }
- return NULL;
- }
- List remove_element(int data, List head) {
- List tmp = head, p = NULL;
- if (head == NULL) return NULL;
- while (tmp && tmp->value != data) {
- p = tmp;
- tmp = tmp->next;
- }
- if (tmp == head) {
- tmp = tmp->next;
- free(head);
- return tmp;
- }
- if (!tmp) return head;
- p->next = tmp->next;
- free(tmp);
- return head;
- }
- List add_element_n_position(int data, int n, List head) {
- List tmp = (List)malloc(sizeof(ListElement));
- if (n < 2) {
- tmp->value = data;
- tmp->next = head;
- return tmp;
- }
- else if (n == sizeof(head)) {
- tmp->value = data;
- tmp->next = NULL;
- List p = head;
- while (p->next) p = p->next;
- p->next = tmp;
- }
- else {
-
- List p = head;
- int count = 1;
- while (count < n - 1 && p->next) {
- p = p->next;
- count++;
- }
- tmp->value = data;
- tmp->next = p->next;
- p->next = tmp;
- }
- return head;
- }
- List swap_elements(int data1, int data2, List head) {
- List check = head;
- int count = 0;
- while (check) {
- if (data1 == check->value || data2 == check->value) {
- count++;
-
- }
- check = check->next;
- }
- if (count != 2) {
- return 0;
- }
- List p = (List)malloc(sizeof(ListElement));
- List tmp1 = head;
- if (head == NULL) return NULL;
- while (tmp1 && tmp1->value != data1) {
- tmp1 = tmp1->next;
- }
- List tmp2 = head;
- if (head == NULL) return NULL;
- while (tmp2 && tmp2->value != data2) {
- tmp2 = tmp2->next;
- }
- p->value = tmp1->value;
- tmp1->value = tmp2->value;
- tmp2->value = p->value;
- return head;
- }
- int main()
- {
- system("chcp 1251>0");
- printf("Введите размер списка: ");
- int n;
- scanf_s("%d", &n);
- List head = create(n);
- printf("Итоговый список:\n");
- /*listprint(head);*/
- bool flag = true;
- while (flag) {
-
- printf("Выберите желаемое действие:\n1 - Удалить список\n2 - Вставить элемент в список\n3 - Удалить элемент списка\n4 - Поменять два элемента местами\n");
- int number;
- scanf_s("%d", &number);
- switch (number) {
- case 1: printf("Результат удаления списка:\n"); head = remove_all(head); listprint(head); flag = false; break;
- 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;
- case 3: printf("Введите элемент, который хотите удалить: "); scanf_s("%d", &data); head = remove_element(data, head); printf("Список с удалённым элементом:\n"); listprint(head); flag = false; break;
- 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;
- default: printf("Такого действия не существует, повторите ввод\n"); break;
- }
- }
- return 0;
- }
|