双向链表nyoj511
来源:互联网 发布:桌面透明软件下载 编辑:程序博客网 时间:2024/06/03 19:51
这道题做了一天了,开始用单向链表做,但是发现用了空表头就在中间处理的时候出现了问题,如果是没形成循环,就没办法记录两个指针;并且多次访问会超时,所以下午用了双向指针加结构体数组来做,ball[i]代表第i个球(类似)节点,然后前后两个指针形成环。在取出小球节点时只处理了一侧的指针,导致浪费了一下午去挑错误。
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define Max 10005struct node{ node *left; node *right; int num; //记录小球球号} ball[Max];void initial (int n) //初始化球环{ for(int i=1; i<=n; i++) { ball[i].num=i; if(i<n) { ball[i].right=&ball[i+1]; } else //处理尾部,与头衔接 { ball[i].right=&ball[1]; } if(i==1) //处理头部,与尾衔接 { ball[i].left=&ball[n]; } else { ball[i].left=&ball[i-1]; } }}void movenode(char a,int x,int y){ struct node *p,*q; p=&ball[x],q=&ball[y]; p->left->right=p->right; //取出小球的位置,前后小球指针互指 p->right->left=p->left; if(a=='A') { q->left->right=p; //在插入位置处理好插入小球与前后小球连接 p->left=q->left; p->right=q; q->left=p; } else if(a=='B') { q->right->left=p; p->right=q->right; p->left=q; q->right=p; }}int findnode(int x,int y) //找出目标小球的左右小球编号{ if(x) return ball[y].right->num; else return ball[y].left->num;}int main(){ //freopen("I:aa.txt","r",stdin); //freopen("F:a.txt","w",stdout); int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); initial(n); char a; int x,y; for(int i=0; i<m; i++) { getchar(); scanf("%c%d%d",&a,&x,&y); if(a=='A'||a=='B') { movenode(a,x,y); } else if(a=='Q') { int ans=findnode(x,y); printf("%d\n",ans); } } } return 0;}
0 0
- 双向链表nyoj511
- NYOJ511 移动小球(链表基础题)(链表法+非链表法)
- SzNOI 双向约瑟夫(双向链表)
- 双向链表&&堆栈
- 双向链表
- 使用双向链表
- 双向链表
- 双向循环链表
- 双向循环链表
- 双向链表
- 实现双向链表
- 双向循环链表
- 建立双向链表
- 双向链表
- 双向链表
- 双向循环链表
- 双向链表
- 链表-双向链表
- App上线流程全攻略(史上最详细步骤)
- hive的自定义函数开发和测试
- HIVE测试用的记录语句
- [leetcode] Reverse Integer
- Android conversion to dalvik format failed with error 1的解决办法
- 双向链表nyoj511
- hdu 1213 并查集入门题
- linux shell 脚本写定时任务
- android应用程序的混淆打包
- 【机器学习算法-python实现】K-means无监督学习实现分类
- 类模板中.h和.cpp的实现方法
- LeetCode OJ算法题(七):Reverse Integer
- POJ1035——Spell checker(字符串操作)
- 单片机IO短路连接问题