本文主要是介绍环型缓冲区,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
昨天英伟达的笔试有考到 环形缓冲区,用数组或链表实现都可以,要求写出代码实现
在网上找了下这个数组实现方式可以参考一下。
还有一题是判断大小端,这个题在面深信服的时候也有问到。
定义一个union
union biglittle {
int a;
short b ;
char c;
}
union biglittle x;
x.a=1;
if(x.c) printf("little edian\n")
else printf("big edian\n");
大概是这个样子。
今天在<linux 0.01内核分析与操作系统设计----创造你自己的操作系统>看到了一个环型缓冲区的是实现,代码简单,实现了基本功能.环型缓冲区是数据通信程序中使用最为广泛的数据结构之一.
- #include <stdio.h>
- #include <ctype.h>
- #define NMAX 8
- //环形缓冲区的初始化
- int iput=0;//环型缓冲区的当前写入位置
- int iget=0;//环型缓冲区的当前读出位置
- int n=0;//环型缓冲区元素总数量
- double buffer[NMAX];
- //环型缓冲区的地址编号计算函数,如果到达唤醒缓冲区的尾部,将饶回到头部。
- //缓型缓冲区的有效编号为:0 到 (NMAX-1)
- int addring(int i)
- {
- return ((i+1)==NMAX) ? 0 : i+1;
- }
- //从环型缓冲区中取一个元素
- double get(void)
- {
- int pos;
- if(n>0)
- {
- pos=iget;
- iget=addring(iget);
- n--;
- return buffer[pos];
- }
- else
- {
- printf("Buffer is empty/n");
- return 0.0;
- }
- }
- //向环型缓冲区中放入一个元素
- void put(double z)
- {
- if(n<NMAX)
- {
- buffer[iput]=z;
- iput=addring(iput);
- n++;
- }
- else
- {
- printf("Buffer is full /n");
- }
- }
- int main(int argc,char *argv[])
- {
- char opera[5];
- double z;
- do
- {
- printf("Please input p|g|e?");
- scanf("%s",&opera);
- switch( tolower(opera[0]) )
- {
- case 'p'://put
- printf("Please input a double number?");
- scanf("%lf",&z);
- put(z);
- break;
- case 'g'://get
- z=get();
- printf("8.2f from buffer/n",z);
- break;
- case 'e':
- printf("End /n");
- break;
- default:
- printf("%s-Operation command error! /n",opera);
- break;
- }
- }
- while(opera[0]!='e');
- return 0;
- }
这个程序最让我学习的地方就是do{}while()的结构.
这篇关于环型缓冲区的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!