Разработать программу, проводящую перемешивание колоды карт путем сдвига и перестановки ее частей - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Не представляю как это написать( Буду благодарен за любую подсказку. Создать двунаправленный список и разместить в нем в определенном порядке данные о колоде игральных карт. Разработать программу, проводящую перемешивание колоды карт путем сдвига и перестановки ее частей. Результаты перемешивания вывести на печать.

Решение задачи: «Разработать программу, проводящую перемешивание колоды карт путем сдвига и перестановки ее частей»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. typedef struct Node_t {
  6.     int info;
  7.     struct Node_t* next;
  8.     struct Node_t* prev;
  9. }   Node;
  10.  
  11. typedef struct List_t {
  12.     Node* head;
  13.     Node* tail;
  14. }   List;
  15.  
  16. //-----------------------------------------------------------------------------
  17. // Добавляем уже существующий узел
  18. List* add(List* list, Node* node) {
  19.     node->next = NULL;
  20.     node->prev = list->tail;
  21.  
  22.     if (list->head == NULL) {
  23.         list->head = list->tail = node;
  24.     }
  25.     else {
  26.         list->tail->next = node;
  27.         list->tail = node;
  28.     }
  29.     return list;
  30. }
  31. //-----------------------------------------------------------------------------
  32. // Создаём и добавляем узел
  33. List* push(List* list, int info) {
  34.     Node* node = malloc(sizeof(Node));
  35.     node->info = info;
  36.  
  37.     return add(list, node);
  38. }
  39. //-----------------------------------------------------------------------------
  40. // Вычленяем заданный узел
  41. Node* isolate(List* list, Node* node) {
  42.     if (node->prev) {
  43.         node->prev->next = node->next;
  44.     }
  45.     else {
  46.         list->head = node->next;
  47.     }
  48.  
  49.     if (node->next) {
  50.         node->next->prev = node->prev;
  51.     }
  52.     else {
  53.         list->tail = node->prev;
  54.     }
  55.     node->prev = node->next = NULL;
  56.  
  57.     return node;
  58. }
  59. //-----------------------------------------------------------------------------
  60. // Определяем длину списка
  61. size_t lstsize(const List* list) {
  62.     size_t cnt = 0;
  63.     const Node* node = list->head;
  64.     for (; node; node = node->next, ++cnt) { ; }
  65.     return cnt;
  66. }
  67. //-----------------------------------------------------------------------------
  68. // Перемешиваем список
  69. List* mix(List* list, unsigned loops) {
  70.     size_t size = lstsize(list), i, j;
  71.     Node* node;
  72.  
  73.     for (i = 0; i < loops; ++i) {
  74.         node = list->head;
  75.         j = rand() % size;
  76.         while (j--) {
  77.             node = node->next;
  78.         }
  79.         add(list, isolate(list, node));
  80.     }
  81.  
  82.     return list;
  83. }
  84. //-----------------------------------------------------------------------------
  85. // Выводим список
  86. void write(const List* list) {
  87.     const Node* node = list->head;
  88.     for (; node; node = node->next) {
  89.         printf("%d ", node->info);
  90.     }
  91.     printf("\n");
  92. }
  93. //-----------------------------------------------------------------------------
  94.  
  95. int main() {
  96.     int i;
  97.     List list = {NULL, NULL};
  98.  
  99.     srand(time(NULL));
  100.  
  101.     for (i = 0; i < 10; ++i) {
  102.         push(&list, i + 1);
  103.     }
  104.     write(&list);
  105.  
  106.     write(mix(&list, 10));
  107.  
  108.     return 0;
  109. }

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


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

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

15   голосов , оценка 3.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы