Разработать программу, проводящую перемешивание колоды карт путем сдвига и перестановки ее частей - C (СИ)
Формулировка задачи:
Не представляю как это написать( Буду благодарен за любую подсказку.
Создать двунаправленный список и разместить в нем в определенном порядке данные о колоде игральных карт. Разработать программу, проводящую перемешивание колоды карт путем сдвига и перестановки ее частей. Результаты перемешивания вывести на печать.
Решение задачи: «Разработать программу, проводящую перемешивание колоды карт путем сдвига и перестановки ее частей»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- typedef struct Node_t {
- int info;
- struct Node_t* next;
- struct Node_t* prev;
- } Node;
- typedef struct List_t {
- Node* head;
- Node* tail;
- } List;
- //-----------------------------------------------------------------------------
- // Добавляем уже существующий узел
- List* add(List* list, Node* node) {
- node->next = NULL;
- node->prev = list->tail;
- if (list->head == NULL) {
- list->head = list->tail = node;
- }
- else {
- list->tail->next = node;
- list->tail = node;
- }
- return list;
- }
- //-----------------------------------------------------------------------------
- // Создаём и добавляем узел
- List* push(List* list, int info) {
- Node* node = malloc(sizeof(Node));
- node->info = info;
- return add(list, node);
- }
- //-----------------------------------------------------------------------------
- // Вычленяем заданный узел
- Node* isolate(List* list, Node* node) {
- if (node->prev) {
- node->prev->next = node->next;
- }
- else {
- list->head = node->next;
- }
- if (node->next) {
- node->next->prev = node->prev;
- }
- else {
- list->tail = node->prev;
- }
- node->prev = node->next = NULL;
- return node;
- }
- //-----------------------------------------------------------------------------
- // Определяем длину списка
- size_t lstsize(const List* list) {
- size_t cnt = 0;
- const Node* node = list->head;
- for (; node; node = node->next, ++cnt) { ; }
- return cnt;
- }
- //-----------------------------------------------------------------------------
- // Перемешиваем список
- List* mix(List* list, unsigned loops) {
- size_t size = lstsize(list), i, j;
- Node* node;
- for (i = 0; i < loops; ++i) {
- node = list->head;
- j = rand() % size;
- while (j--) {
- node = node->next;
- }
- add(list, isolate(list, node));
- }
- return list;
- }
- //-----------------------------------------------------------------------------
- // Выводим список
- void write(const List* list) {
- const Node* node = list->head;
- for (; node; node = node->next) {
- printf("%d ", node->info);
- }
- printf("\n");
- }
- //-----------------------------------------------------------------------------
- int main() {
- int i;
- List list = {NULL, NULL};
- srand(time(NULL));
- for (i = 0; i < 10; ++i) {
- push(&list, i + 1);
- }
- write(&list);
- write(mix(&list, 10));
- return 0;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д