您的位置:首页 > 理论基础 > 数据结构算法

nyoj 551 移动小球

2012-03-29 20:11 204 查看
第一次尝试用链表,以前从来不知道链表是什么玩意。。。

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

我发现基础真的很重要,我真的有点好高骛远了,当我想学字典树的时候,我发现自己还不会链表

,没办法只有好好去看看数据结构了,没看还好,一看我发现自己竟然不清楚什么是指针。。

,于是狠下心来,终于把指针看了一遍。你说我容易吗???队友们几星期前已经把字典树搞定了,现在都在弄最短路,我真是远远落后了,看来不努力是不行了呀。。

#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
;//1的左指针指向n
node
.r=&node[1];//n的右指针指向1
node
.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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 build struct c ini