UVA133
作者:互联网
这是一道很好的练习链表的题目
先给出我写的代码
#include<cstdio> using namespace std; const int maxn = 20+3; struct person { int index; person *clockwise; person *con_clockwise; }Node[maxn]; person *off, *off_con;//删除了第一个节点怎么办 int N,k,m; //连接两个节点 void connect(person *u, person*v) { u->clockwise=v; v->con_clockwise=u; } void initial()//构建链表 { for(int i = 0;i<N;i++)//构造圈的方式,必须从0开始 { Node[i].index = i + 1;//Node[0]的编号是1 Node[i].clockwise = Node + (i + N + 1)%N; Node[i].con_clockwise = Node + (i + N - 1)%N; } off = Node; //printf("inital之后%d\n",off->index); off_con = Node + N - 1; //printf("inital之后%d\n",off_con->index); } void print_left() { printf("\n"); person *u=off; for(;;) { printf("%d ",u->index); u=u->clockwise; if(u==off) { break; } } printf("\n"); } void pick() { for(;;) { for(int i=0;i<k-1;i++)//顺时针pick 按照k来数 { off=off->clockwise; } for(int i=0;i<m-1;i++)//逆时针pick 按照m来数 { off_con=off_con->con_clockwise; } if(off->index==off_con->index) { printf("%3d",off->index); off->index=0; if(off->clockwise==off)//如果只剩下一个了 { return; } else { connect(off->con_clockwise,off->clockwise);//脑海里应当有链表的图像 off=off->clockwise; off_con=off_con->con_clockwise; } } else { printf("%3d%3d",off->index,off_con->index); off->index=0; off_con->index=0; connect(off->con_clockwise,off->clockwise); if(off->clockwise->index) { off=off->clockwise; } else off=off->clockwise->clockwise; if(off_con->clockwise==off_con) { return; } else { connect(off_con->con_clockwise,off_con->clockwise); off_con=off_con->con_clockwise; } } printf(","); //print_left(); } } int main() { #ifdef local freopen("input.txt","r",stdin); freopen("out.txt","w",stdout); #endif while(scanf("%d%d%d",&N,&k,&m)==3&&N&&k&&m) { //printf("%d\n",N); initial(); //print_left(); pick(); printf("\n"); } return 0; }
首先来总结一下构造链表的过程,和以往的new不同,这次我选择了直接使用数组,省去了new的步骤,非常的简洁,以后构造链表应该会按照这种方式来构造,但要注意的一点是,这种构造的方式,只适合于有限个节点。
第二个总结一下处理链表的思路。首先第一条就是,脑海当中必须有很清晰的图案,对于这个链表的图案,哪些节点互相连着,哪些已经断开(包括已经被逐出这个链表的节点也可能与某些节点连着)。第二条就是,删除节点的时候,如果要连接剩下的左右两边的节点,那么最好使用connect函数来连接。
刘汝佳大神写的程序是使用数组写的,但是那种方式更加的抽象一点。我觉得我这种方式更好理解一点。
标签:index,off,链表,printf,clockwise,UVA133,con 来源: https://www.cnblogs.com/TorettoRui/p/10392568.html