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