环型缓冲区

 今天在<linux 0.01内核分析与操作系统设计----创造你自己的操作系统>看到了一个环型缓冲区的是实现,代码简单,实现了基本功能.环型缓冲区是数据通信程序中使用最为广泛的数据结构之一.
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #define NMAX    8
  4. //环形缓冲区的初始化
  5. int iput=0;//环型缓冲区的当前写入位置
  6. int iget=0;//环型缓冲区的当前读出位置
  7. int n=0;//环型缓冲区元素总数量
  8. double buffer[NMAX];
  9. //环型缓冲区的地址编号计算函数,如果到达唤醒缓冲区的尾部,将饶回到头部。
  10. //缓型缓冲区的有效编号为:0 到 (NMAX-1)
  11. int addring(int i)
  12. {
  13.     return ((i+1)==NMAX) ? 0 : i+1;
  14. }
  15. //从环型缓冲区中取一个元素
  16. double get(void)
  17. {
  18.     int pos;
  19.     if(n>0)
  20.     {
  21.         pos=iget;
  22.         iget=addring(iget);
  23.         n--;
  24.         return buffer[pos];
  25.     }
  26.     else
  27.     {
  28.         printf("Buffer is empty/n");
  29.         return 0.0;
  30.     }
  31. }
  32. //向环型缓冲区中放入一个元素
  33. void put(double z)
  34. {
  35.     if(n<NMAX)
  36.     {
  37.         buffer[iput]=z;
  38.         iput=addring(iput);
  39.         n++;
  40.     }
  41.     else
  42.     {
  43.         printf("Buffer is full /n");
  44.     }
  45. }
  46. int main(int argc,char *argv[])
  47. {
  48.     char opera[5];
  49.     double z;
  50.     do
  51.     {
  52.         printf("Please input p|g|e?");
  53.         scanf("%s",&opera);
  54.         switch( tolower(opera[0]) )
  55.         {
  56.          case 'p'://put
  57.                 printf("Please input a double number?");
  58.                 scanf("%lf",&z);
  59.                 put(z);
  60.                 break;
  61.          case 'g'://get
  62.                 z=get();
  63.                 printf("8.2f from buffer/n",z);
  64.                 break;
  65.          case 'e':
  66.                 printf("End /n");
  67.                 break;
  68.          default:
  69.                  printf("%s-Operation command error! /n",opera);
  70.                  break;
  71.         }
  72.     }
  73.     while(opera[0]!='e');
  74.  return 0;
  75. }

这个程序最让我学习的地方就是do{}while()的结构.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值