Выполнить циклический сдвиг списка на 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 узла влево и вправо соответственно.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д