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