nyoj 551 移动小球

第一次尝试用链表,以前从来不知道链表是什么玩意。。。

通过一点点研究老秃驴的代码,才弄懂的,原来这就是传说中的链表。。

我发现基础真的很重要,我真的有点好高骛远了,当我想学字典树的时候,我发现自己还不会链表抓狂,没办法只有好好去看看数据结构了,没看还好,一看我发现自己竟然不清楚什么是指针。。大哭,于是狠下心来,终于把指针看了一遍。你说我容易吗???队友们几星期前已经把字典树搞定了,现在都在弄最短路,我真是远远落后了,看来不努力是不行了呀。。

#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;
}


你可能感兴趣的:(nyoj 551 移动小球)