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

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


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

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

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