Выполнить циклический сдвиг списка на 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 узла влево и вправо соответственно.