数据结构基础_链表

链表

说实话,感觉链表用的不是很彻底,,,

移动小球

题目:你有一些小球,从左到右编号1,2,3,....,n。输入小球个数n,指令条数m,从左到右输出最后的序列。注意n可高达50000,而m可高达100000。

  输入:

    6 2
    A 1 4
    B 3 5

  输出:

    2 1 4 5 3 6

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 #define MAXN  500005
 5 
 6 int lft[MAXN],rgt[MAXN];
 7 
 8 int main()
 9 {
10   int p,q,i,n,m;
11   char type[2];
12   scanf("%d%d",&n,&m);
13   for(i = 0; i <= n+1; i++)
14   {
15     lft[i] = i-1;
16     rgt[i] = i+1;
17   }
18   for(i = 0; i < m; i++)
19   {
20     scanf("%s%d%d",type,&p,&q);
21     //lft[p]/p/rgt[p]。把中间的p删除
22     rgt[lft[p]] = rgt[p];
23     lft[rgt[p]] = lft[p];
24     //在 lft[q]/q之间插入q.
25     if(type[0] == 'A')
26     {
27       rgt[lft[q]] = p;
28       lft[p] = lft[q];
29       lft[q] = p;
30       rgt[p] = q;
31     }
32     //在q/rgt[q]之间插入p.
33     else
34     {
35       lft[rgt[q]] = p;
36       rgt[p] = rgt[q];
37       rgt[q] = p;
38       lft[p] = q;
39     }
40   }
41   //最右边为n+1
42   int front = rgt[0];
43   while(rgt[front] != n+2)
44   {
45     printf("%d ",front);
46     front = rgt[front];
47   }
48 //  printf("%d\n",front);
49   return 0;
50 }

 对比测试

嗯,单纯的生成随机数

 1 #include <stdio.h>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 int n=100,m=100000;
 5 double random(){//生成[0,1]之间的均匀随机数
 6     return (double)rand()/RAND_MAX;
 7 }
 8 int random(int m){//生成[0,m-1]之间的均匀随机数
 9     return (int)(random()*(m-1)+0.5);
10 }
11 int main() {
12     srand(time(NULL));//初始化随机数种子
13     printf("%d %d\n",n,m);
14     int k=0;
15     for(int i=0;i<m;i++){
16         if(rand()%2==0)printf("A");else printf("B");
17         int X,Y;
18         for(;;){
19             X=random(n)+1;
20             Y=random(n)+1;
21             if(X!=Y) break;
22         }
23         k++;
24         printf(" %d %d %d\n",k,X,Y);
25 
26     }
27     return 0;
28 }

 

输出部分结果:

     

 

posted @ 2017-08-03 16:48  JanFangZ  阅读(121)  评论(0编辑  收藏  举报