这个是队列的一个医院看病的例子,是用链队列解决的,看着还好,但是实际过程中,还是遇到了麻烦。
当你第一次输入一个a然后回车的时候,就会碰到将缓存区中的‘\n’给输出去的结果,然后就会是"非法命令",可是,我们根本什么命令都没有输入呢!
于是单步调试了下,关键是忘了缓存区清除的问题,然后,先用了fflush(stdin),然而这个函数,对于linux来讲,根本起不到应有的作用。
于是换做getchar()函数,吃掉以前输入的'\n',可是,当放到77行之前和79行之后,效果是完全不同的,放到79行之后,相当于还需要一个输入的样子,而放到77行printf之前的话,除了第一次需要嗯下任意键之外,其余时候,都可以吃掉上一次输入命令之后的‘\n’。
于是我百度了下,解决缓存区缓存的方法:
Linux 下清空 stdin 用两种方法:
1.通过读取剩余的字符并丢弃掉; char ch; while((ch=getchar())!='\n'&&ch!=EOF); 或者是: char s[1024]; fgets(s,1024,stdin);
2.使用函数 setbuf(stdin,NULL);于是我使用了setbuf(stdin,NULL)做了一下实验,问题又来了,当我不停的输入命令'a'的时候,每一步都是对的。然而,当我输入'n'的时候,它会出现正确结果,但是又会走一步default,
接着单步调试,可是单步调试的时候是正确的。到现在还没弄清楚是为什么。。。
——————————————————————
还有一个关于杨辉三角的输出问题,这个是用了循环队列做的
- include
- #include
- #define TRUE 1
- #define FALSE 0
- #define MAX 50
- typedef struct
- {
- int data[MAX];
- int front;
- int rear;
- }CircleQueue;
- //初始化
- void InitQueue(CircleQueue *Q)
- {
- Q->front=Q->rear=0;
- return;
- }
- //入队列
- int EnterQueue(CircleQueue *Q,int x,int N)
- {
- if((Q->rear 1)%N==Q->front)
- {
- printf("队列已满!\n");
- return FALSE;
- }
- Q->data[Q->rear]=x;
- Q->rear=(Q->rear 1)%N;
- return TRUE;
- }
- //出队列
- int DeleteQueue(CircleQueue *Q,int *x,int N)
- {
- if(Q->rear==Q->front)
- {
- printf("队列已空!\n");
- return FALSE;
- }
- *x=Q->data[Q->front];
- Q->front=(Q->front 1)%N;
- return *x;
- }
- int GetHead(CircleQueue *Q,int *x)
- {
- if(Q->rear==Q->front)
- {
- printf("无可取队列头!\n");
- return FALSE;
- }
- else
- {
- *x=Q->data[Q->front];
- return *x;
- }
- }
- int main()
- {
- int n,i,j;
- int N;
- int x,temp;
- CircleQueue Q;
- InitQueue(&Q);
- printf("请输入您想打印的行数:");
- scanf("%d",&N);
- EnterQueue(&Q,1,N);
- for(n=2;n{
- EnterQueue(&Q,1,N);
- for(i=1;i<=n-2;i )
- {
- DeleteQueue(&Q,&temp,N);
- printf("=",temp);
- GetHead(&Q,&x);
- temp=temp x;
- EnterQueue(&Q,temp,N);
- }
- DeleteQueue(&Q,&x,N);
- printf("=\n",x);
- EnterQueue(&Q,1,N);
- }
- while(Q.rear!=Q.front)
- {
- DeleteQueue(&Q,&x,N);
- printf("=",x);
- }
- printf("\n");
- return 0;
- }
这个程序在写的时候,关键是n的取值上,第一行只输出一个1就换行,中间的循环是输出除了第一个1和最后一个1之外,中间值的代码。
阅读(1314) | 评论(0) | 转发(0) |