# 12695 - Card Magic (Simplified)
>author: Utin
###### tags: `linked list`
---
## Brief
See the code below
## Solution 0
```c=
#ifndef __FUNCTION_H__
#define __FUNCTION_H__
#include <stdio.h>
#include <stdlib.h>
typedef struct _Node{
int size;
int* data;
struct _Node* next;
} Node;
extern Node* ReadOneList();
extern void PrintList(Node*);
extern void Merge(Node*, int, int);
extern void Cut(Node*, int, int);
Node* CreateNode(int size){
Node* n = (Node*) malloc( sizeof(Node) );
n->size = size;
n->data = (int*) malloc( sizeof(int) * size );
n->next = NULL;
return n;
}
Node* ReadOneList(){
int Ni;
scanf("%d:", &Ni);
Node* new_node = CreateNode(Ni);
for (int i=0; i<new_node->size; i++){
scanf(" %d", &(new_node->data[i]) );
}
return new_node;
}
void PrintList(Node* dummy_head){
Node* cur = dummy_head->next;
while (cur != NULL) {
printf("%d", cur->data[0]);
for(int i=1; i<cur->size; i++){
printf(" %d", cur->data[i]);
}
printf("\n");
cur = cur->next;
}
}
void Merge(Node* dummy_head, int back, int front){
// search
Node* f, * b, * pre_b, * curr = dummy_head;
for (int i = 0; i <= back || i <= front; i++) {
if (i == back-1) pre_b = curr;
if (i == back) b = curr;
if (i == front) f = curr;
curr = curr->next;
}
// merge data
int* tmp = (int*) malloc(sizeof(int) * (b->size + f->size));
for (int i = 0; i < f->size; i++) {
tmp[i] = f->data[i];
}
for (int i = f->size; i < f->size + b->size; i++) {
tmp[i] = b->data[i-f->size];
}
f->size += b->size;
// connect linked list
free(f->data);
free(b->data);
f->data = tmp;
pre_b->next = b->next;
free(b);
}
void Cut(Node* dummy_head, int x, int idx){
Node* prev_x = dummy_head;
Node* list_x = dummy_head->next;
while( --x ) list_x = list_x->next, prev_x = prev_x->next;
int size_x1 = idx, size_x2 = list_x->size - size_x1;
Node* list_x1 = CreateNode( size_x1 );
Node* list_x2 = CreateNode( size_x2 );
for(int i=0; i<list_x1->size; i++)
list_x1->data[i] = list_x->data[i];
for(int i=0; i<list_x2->size; i++)
list_x2->data[i] = list_x->data[i + list_x1->size];
prev_x->next = list_x1;
list_x1->next = list_x2;
list_x2->next = list_x->next;
free(list_x->data);
free(list_x);
}
#endif
// By Utin
```
## Reference