Выполнить циклический сдвиг списка на N элементов вправо или влево - C (СИ)
Формулировка задачи:
Помогите пожалуйста
Организация:очередь
Создать список из заданного количества элементов. Выполнить циклический сдвиг этого списка на N элементов вправо или влево.
Решение задачи: «Выполнить циклический сдвиг списка на N элементов вправо или влево»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct Node { int data; struct Node* next; } Node; typedef struct List { Node* head; Node* tail; } List; //----------------------------------------------------------------------------- List* push(List* list, int data) { Node* node = malloc(sizeof(Node)); node->data = data; node->next = NULL; if (list->head == NULL) { list->head = list->tail = node; } else { list->tail->next = node; list->tail = node; } return list; } //----------------------------------------------------------------------------- void print(const List* list) { const Node* node; for (node = list->head; node; node = node->next) { printf("%d ", node->data); } printf("\n"); } //----------------------------------------------------------------------------- List* shiftLeft(List* list) { if (list->head == list->tail) { return list; } Node* node = list->head; list->head = list->head->next; node->next = NULL; list->tail->next = node; list->tail = node; return list; } //----------------------------------------------------------------------------- List* shiftRight(List* list) { if (list->head == list->tail) { return list; } Node* node; for (node = list->head; node->next != list->tail; node = node->next) { ; } node->next = NULL; list->tail->next = list->head; list->head = list->tail; list->tail = node; return list; } //----------------------------------------------------------------------------- List* shiftLeftN(List* list, unsigned cnt) { while (cnt--) { shiftLeft(list); } return list; } //----------------------------------------------------------------------------- List* shiftRightN(List* list, unsigned cnt) { while (cnt--) { shiftRight(list); } return list; } //----------------------------------------------------------------------------- int main() { List list = {NULL, NULL}; int i = 10; srand(time(NULL)); while (i--) { push(&list, rand() % 100); } print(&list); print(shiftLeftN(&list, 3)); print(shiftRightN(&list, 4)); return 0; }
Объяснение кода листинга программы
В данном коде используется структура данных список
(List), состоящая из узлов (Node). Каждый узел содержит целочисленное значение (data) и ссылку на следующий узел (next).
- Функция push добавляет новый узел в список. Если список пуст, то новый узел становится и головой, и хвостом списка. В противном случае новый узел добавляется в конец списка.
- Функция print выводит на экран все значения в списке, переходя по ссылке на следующий узел.
- Функция shiftLeft сдвигает все элементы списка влево на один узел. Если список состоит из одного узла, то он остается неизменным.
- Функция shiftRight сдвигает все элементы списка вправо на один узел. Если список состоит из одного узла, то он остается неизменным.
- Функция shiftLeftN сдвигает все элементы списка влево на указанное количество узлов. Если количество узлов больше, чем есть в списке, то список остается неизменным.
- Функция shiftRightN сдвигает все элементы списка вправо на указанное количество узлов. Если количество узлов больше, чем есть в списке, то список остается неизменным. В функции main создается список, в который добавляются 10 случайных чисел. Затем список выводится на экран, после чего выполняются циклические сдвиги на 3 и 4 узла влево и вправо соответственно.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д