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

  1. Функция push добавляет новый узел в список. Если список пуст, то новый узел становится и головой, и хвостом списка. В противном случае новый узел добавляется в конец списка.
  2. Функция print выводит на экран все значения в списке, переходя по ссылке на следующий узел.
  3. Функция shiftLeft сдвигает все элементы списка влево на один узел. Если список состоит из одного узла, то он остается неизменным.
  4. Функция shiftRight сдвигает все элементы списка вправо на один узел. Если список состоит из одного узла, то он остается неизменным.
  5. Функция shiftLeftN сдвигает все элементы списка влево на указанное количество узлов. Если количество узлов больше, чем есть в списке, то список остается неизменным.
  6. Функция shiftRightN сдвигает все элементы списка вправо на указанное количество узлов. Если количество узлов больше, чем есть в списке, то список остается неизменным. В функции main создается список, в который добавляются 10 случайных чисел. Затем список выводится на экран, после чего выполняются циклические сдвиги на 3 и 4 узла влево и вправо соответственно.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы