[系统设计] 腾讯笔试题目:设计排队系统,让每个进入队伍的用户都能看到自己在中所处位置和变化

请设计一个排队系统,能够让每个进入队伍的用户都能看到自己在 中所处的位置和变化。队伍可能随时有人加入和退出,当有人退出影响到用户的位置排名时需要即时反馈到用户。

分析:使用双联表完成该任务比较简单,并且容易扩展实现其他的功能。
1. 当插入时,从队尾插入节点,插入完成以后向每个用户通知即可。
2. 从队列中删除元素时,通过元素的在队列中的位置将其删除,并且将其后的元素的位置依次向前移。


  1. #include <stdio.h>

  2. struct NODE
  3. {
  4.         int num;
  5.         int mark;//the person mark,it is also can be a string.
  6.         NODE * pre;
  7.         NODE * next;
  8. } * HEAD , * TAIL;

  9. void showQueue();
  10. void join();
  11. void exit( int num );

  12. void main()
  13. {
  14.         HEAD = new NODE;
  15.         HEAD->num = 0;
  16.         HEAD->pre = NULL;
  17.         HEAD->next = NULL;
  18.         TAIL = HEAD;

  19.         join();join();join();join();join();join();join();join();

  20.         showQueue();
  21.         exit(3);exit(1);exit(6);
  22.         showQueue();
  23. }

  24. void showQueue()
  25. {
  26.         NODE * pointer = HEAD;
  27.         while( pointer->next != NULL )
  28.         {
  29.                 printf( "queue number is %d\n" , pointer->num );
  30.                 pointer = pointer->next;
  31.         }
  32. }

  33. void join()
  34. {
  35.         NODE * current = new NODE;

  36.         current->num = TAIL->num+1;
  37.         current->pre = TAIL;
  38.         current->next = NULL;

  39.         TAIL->next = current;
  40.         TAIL = current;
  41. }

  42. void exit( int num )
  43. {
  44.         if( num > 0 )
  45.         {
  46.                 NODE * p = HEAD;
  47.                 NODE * removeNode = NULL;

  48.                 while( p != NULL )
  49.                 {
  50.                         if ( p->num == num )
  51.                         {
  52.                                 removeNode = p;
  53.                                 break;
  54.                         }
  55.                         p = p->next;
  56.                 }

  57.                 if ( removeNode != NULL )
  58.                 {
  59.                         printf( "%d number exit!\n" , removeNode->num );

  60.                         //remove node
  61.                         if ( removeNode->pre != NULL )
  62.                         {
  63.                                 removeNode->pre->next = removeNode->next;
  64.                         }
  65.                         if ( removeNode->next != NULL )
  66.                         {
  67.                                 removeNode->next->pre = removeNode->pre;
  68.                         }

  69.                         //sub queue number
  70.                         while( removeNode->next != NULL )
  71.                         {
  72.                                 removeNode->next->num--;
  73.                                 removeNode = removeNode->next;
  74.                         }
  75.                 }
  76.                 else
  77.                 {
  78.                         printf( "%d this number is not exist!\n" , num );
  79.                 }
  80.         }
  81.         else
  82.         {
  83.                 printf( "please input correct number!\n" );
  84.         }
  85. }
复制代码

解答转载:CSDN


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值