第一次尝试用链表,以前从来不知道链表是什么玩意。。。
通过一点点研究老秃驴的代码,才弄懂的,原来这就是传说中的链表。。
我发现基础真的很重要,我真的有点好高骛远了,当我想学字典树的时候,我发现自己还不会链表,没办法只有好好去看看数据结构了,没看还好,一看我发现自己竟然不清楚什么是指针。。,于是狠下心来,终于把指针看了一遍。你说我容易吗???队友们几星期前已经把字典树搞定了,现在都在弄最短路,我真是远远落后了,看来不努力是不行了呀。。
#include<stdio.h>
#define m 10005
struct Node//建立链表
{
int a;
Node *l,*r;//左右指针
}node[m];
void build(int n)//给链表赋值
{
int i;
for(i=1;i<n;i++)
{
node[i].a=i;
node[i].r=&node[i+1];
node[i+1].l=&node[i];
}
node[1].l=&node[n];//1的左指针指向n
node[n].r=&node[1];//n的右指针指向1
node[n].a=n;
}
void A(int x,int y)//把x移到y的左边
{
Node *p=&node[x],*q=&node[y];//定义两个指针分别指向x和y
p->l->r=p->r;//令 x的左边结点的右指针等于x的右指针
p->r->l=p->l;//令x的右边结点的左指针等于x的左指针
p->l=q->l;//令x的左指针等于y的左指针
p->r=q; // 令x的右指针指向y
q->l->r=p; //令y的左边结点的右指针指向x
q->l=p; //令y的左指针指向x
}
void B(int x,int y)
{
Node *p=&node[x],*q=&node[y];
p->l->r=p->r;
p->r->l=p->l;
p->l=q;
p->r=q->r;
q->r->l=p;
q->r=p;
}
int main()
{
int n,k,s,b,c;
char cmp;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&k,&s);
build(k);
while(s--)
{
scanf("%*c%c%d%d",&cmp,&b,&c);
switch(cmp)
{
case 'A':A(b,c);break;
case 'B':B(b,c);break;
case 'Q':printf("%d\n",b?node[c].r->a:node[c].l->a);break;
}
}
}
return 0;
}