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 }

 

posted @ 2018-08-25 17:46  achived  阅读(120)  评论(0编辑  收藏  举报