201703-2-学生排队
1 #include<cstdio> 2 #include<iostream> 3 4 const int MAX = 1005; 5 using namespace std; 6 7 typedef struct node{ 8 int x; 9 int pre, next; 10 }Node; 11 12 //整个例子时间主要用于指向下一个节点的过程,代码:46行,66行 13 int main() 14 { 15 int n,m,p,q,i,j=0; 16 //在结构体中,学号既是数组下标也是值,所以说,其实值是多余的存在,这样子在查找符合对应学号的学生时, 17 //就避免了链表的查询速度慢的缺点 18 //使用结构体创建链表避免了数组移动速度慢的缺点 19 Node stu1[MAX]; 20 scanf("%d",&n); 21 stu1[0].pre = -1; 22 stu1[0].x = n; 23 stu1[0].next = 1;//通过首节点找到整条链表 24 for(i = 1;i <= n;i++)//初始化 25 { 26 stu1[i].x = i; 27 stu1[i].pre = i-1; 28 if(i+1 <= n)//结尾 29 stu1[i].next = i+1; 30 else 31 stu1[i].next = -1; 32 } 33 int pr,ne; 34 scanf("%d",&m); 35 while(m > 0) 36 { 37 scanf("%d %d",&p,&q); 38 j = p; 39 if(q > 0)//学号为p的同学向后移动q 40 { 41 pr = stu1[j].pre; 42 ne = stu1[j].next; 43 stu1[pr].next = stu1[j].next; 44 stu1[ne].pre = stu1[j].pre; 45 i = j; 46 while(q > 0) 47 { 48 j = stu1[j].next; 49 q--; 50 } 51 ne = stu1[j].next; 52 stu1[j].next = i; 53 stu1[i].pre = j; 54 stu1[i].next = ne; 55 if(ne != -1)//如果不是最后一个节点 56 stu1[ne].pre = i; 57 } 58 else//学号为p的同学向前移动-q 59 { 60 q = -q; 61 pr = stu1[j].pre; 62 ne = stu1[j].next; 63 stu1[pr].next = stu1[j].next; 64 stu1[ne].pre = stu1[j].pre; 65 i = j; 66 while(q > 0) 67 { 68 j = stu1[j].pre; 69 q--; 70 } 71 pr = stu1[j].pre; 72 stu1[j].pre = i; 73 stu1[pr].next = i; 74 stu1[i].pre = pr; 75 stu1[i].next = j; 76 } 77 m--; 78 } 79 i = 0; 80 i = stu1[i].next; 81 while(i != -1) 82 { 83 printf("%d ",stu1[i].x); 84 i = stu1[i].next; 85 } 86 87 return 0; 88 }