#define _CRT_SECURE_NO_WARNINGS #include #include #include struct MyStruct { int a; struct MyStruct* next; }; typedef struct MyStruct s; s* create(int n) { s* start = malloc(sizeof(s)); start->a = 1; start->next = NULL; s* p, * q; p = start; for (int i = 0; i < n - 1; i++) { q = malloc(sizeof(s)); q->a = p->a + 1; p->next = q; p = q; } p->next = NULL; return start; } void show(s* list) { while (list) { if (list != NULL) { printf("%d ", list->a); list = list->next; } } printf("\n"); } void delete(s* list) { s* p = list; while (p->next) { p = list->next; free(list); list = p; } } s* insert(s* list, s item, int k) { s* el = malloc(sizeof(s));//выделяем память под новый элемент списка el->a = item.a;//помещаем в него поле из структуры if (k == 1)//если мы меняем первый элемент { el->next = list; list = el; } else // если меняем не первый элемент { s* start = list;//запоминаем голову списка for (size_t i = 0; i < k - 1; i++) { list = list->next;//сдвигаем на k позиций if (!(list->next)) { printf("вы ввели индекс, превышающий размеры списка. МЫ вставим элемент в конец списка\n"); break; } } void* temp = list->next;//обмен адресами list->next = el; el->next = temp; list = start;//возвращаем голову на место } return list; } void delete_el(s* list) { printf_s("Введите номер элемента списка, который вы хотите удалить\n"); int n = 0; scanf_s("%d", &n); if (list == NULL) { return; } s* p = list; s* prev = NULL; while (p) { if (p->a == n) { if (prev == NULL) { // Remove head node list = p->next; } else { prev->next = p->next; } free(p); return; } prev = p; p = p->next; } } void change_element(s*list) { int c, b = 0; printf_s("Введите первый index для замены\n"); scanf_s("%d", &c); printf_s("Введите второй index для замены\n"); scanf_s("%d", &b); if (list == NULL) { return; } s* p = list; s* prev = NULL; s* p1 = list; s* prev1 = NULL; while (p && p->a != c) { prev = p; p = p->next; } while (p1 && p1->a != b) { prev1 = p1; p1 = p1->next; } if (!p || !p1) { return; } if (prev == NULL) { // p1 is the head node list = p1; } else { prev->next = p1; } if (prev1 == NULL) { // p2 is the head node list = p; } else { prev1->next = p; } s* temp = p->next; p->next = p1->next; p1->next = temp; } int main() { system("chcp 1251>nul"); int siz = 0; printf_s("Введите размер списка\n"); scanf_s("%d", &siz); s* list1 = create(siz); show(list1); int v = 0; printf("Выберите, что будем делать:\n1.Вставить значение.\n2.Удалить список.\n3.Удалить элемент из списка\n4.Поменять местами элементы списка\n"); scanf_s("%d", &v); if(v == 1){ int value = 0; int mesto = 0; printf_s("Введите желаемое значение\n"); scanf_s("%d", &value); s item = { value,NULL }; printf_s("Введите место, куда вы хотите вставить значение\n"); scanf_s("%d", &mesto); list1 = insert(list1, item, mesto-1); show(list1); } else if (v == 2) { delete(list1); show(list1); } else if (v == 3) { delete_el(list1); show(list1); } else if (v == 4) { change_element(list1); show(list1); } return 0; }