Untitled
unknown
c_cpp
4 years ago
2.1 kB
9
Indexable
#include "function.h"
#include <stdlib.h>
#include <stdio.h>
typedef struct child{
int age;
int ip;//initial position
} Child;
//age sequence
Child *AS;
//pointers to each node directly
Node **NP;
int compare_child (const void *a, const void *b)
{
const Child *ia = (const Child *) a;
const Child *ib = (const Child *) b;
return (*ia).age-(*ib).age;
}
Node* createList(int n)
{
int i;
AS = (Child *)malloc(sizeof(Child)*(n));
head = (Node *)malloc(sizeof(Node)*(n));
for(i=0;i<n;i++)
{
scanf("%d",&(AS[i].age));
AS[i].ip=i;
head[i].age=AS[i].age;
}
//create the doubly circular linked list
for(i=1;i<n;i++)
{
head[i-1].next=&(head[i]);
head[i].prev=&(head[i-1]);
}
head[n-1].next=&(head[0]);
head[0].prev=&(head[n-1]);
//sort
qsort(AS, n, sizeof(Child), compare_child);
//Let NP[i] point to the node of the ith youngest child
NP = (Node**)malloc(sizeof(Node*)*(n));
for(i=0;i<n;i++) NP[i]=&head[AS[i].ip];
return head;
}
void clockwise(int A, int K)
{
int i;
Node* cur = NP[A-1]->next;
NP[A-1]->prev->next = NP[A-1]->next;
NP[A-1]->next->prev = NP[A-1]->prev;
for(i=1;i<K;i++)
{
cur = cur->next;
}
NP[A-1]->prev = cur;
NP[A-1]->next = cur->next;
cur->next->prev = NP[A-1];
cur->next = NP[A-1];
}
void counterclockwise(int A, int K)
{
int i;
Node* cur = NP[A-1]->prev;
NP[A-1]->prev->next = NP[A-1]->next;
NP[A-1]->next->prev = NP[A-1]->prev;
for(i=1;i<K;i++)
{
cur = cur->prev;
}
NP[A-1]->next = cur;
NP[A-1]->prev = cur->prev;
cur->prev->next = NP[A-1];
cur->prev = NP[A-1];
}
Node* solve(int n, int m)
{
int i;
int A,K;
char Dir[2];
for(i=0;i<m;i++)
{
scanf("%d%d%s",&A,&K,Dir);
if(n<=2);//do nothing
else if(Dir[0]=='R')
clockwise(A,K);
else
counterclockwise(A,K);
}
return NP[0];
}
Editor is loading...