Chinaunix首页 | 论坛 | 博客
  • 博客访问: 156318
  • 博文数量: 36
  • 博客积分: 802
  • 博客等级: 准尉
  • 技术积分: 717
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-02 22:47
文章分类
文章存档

2012年(36)

分类: C/C++

2012-08-28 14:09:54

这个是队列的一个医院看病的例子,是用链队列解决的,看着还好,但是实际过程中,还是遇到了麻烦。

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #define TRUE 1
  5. #define FALSE 0

  6. typedef struct node
  7. {
  8.     int c;
  9.     struct node *next;
  10. }LinkQueueNode;

  11. typedef struct
  12. {
  13.     LinkQueueNode *front;
  14.     LinkQueueNode *rear;
  15. }LinkQueue;

  16. void InitQueue(LinkQueue *Q)
  17. {
  18.     Q->front=Q->rear=NULL;
  19.     return;
  20. }
  21. int Isempty(LinkQueue *Q)
  22. {
  23.     if(Q->front==Q->rear)
  24.         return TRUE;
  25.     else
  26.         return FALSE;
  27. }

  28. int EnterQueue(LinkQueue *Q,int x)
  29. {
  30.     LinkQueueNode *NewNode;
  31.     NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
  32.     NewNode->c=x;
  33.     if(NewNode==NULL)
  34.     {
  35.         printf("内存分配失败!\n");
  36.         return FALSE;
  37.     }
  38.     if(Q->rear==NULL)
  39.         Q->front=Q->rear=NewNode;
  40.     else
  41.     {
  42.         Q->rear->next=NewNode;
  43.         Q->rear=NewNode;
  44.     }
  45.     return TRUE;
  46. }

  47. int DeleteQueue(LinkQueue *Q,int *x)
  48. {
  49.     LinkQueueNode *temp;
  50.     if(Q->front==Q->rear)
  51.         return FALSE;
  52.     temp=Q->front;
  53.     Q->front=Q->front->next;
  54.     if(Q->rear==temp->next)
  55.         Q->rear=Q->front;
  56.     *x=temp->c;
  57.     free(temp);
  58.     return *x;
  59. }

  60. int main()
  61. {
  62.     LinkQueue Q;
  63.     int flag=1;
  64.     char ch;
  65.     int n;
  66.     InitQueue(&Q);
  67.     while(flag)
  68.     {
  69.     //    setbuf(stdin,NULL);
  70.         getchar();
  71.         printf("请医生发出命令:");
  72.     //    fflush(NULL);
  73.         ch=getchar();
  74.     //    getchar();
  75.         switch(ch)
  76.         {
  77.             case 'a':
  78.                      printf("请出示您的病历号:");
  79.                      scanf("%d",&n);
  80.                      EnterQueue(&Q,n);
  81.                      break;
  82.             case 'n':if(!Isempty(&Q))
  83.                      {
  84.                          DeleteQueue(&Q,&n);
  85.                          printf("请让病历号为%d的病人就诊!\n",n);
  86.                      }
  87.                      else
  88.                      {
  89.                          printf("无人就诊!\n");
  90.                      }
  91.                      break;
  92.             case 'q':printf("今天停止挂号。下列病人依次就诊:");
  93.                      while(!Isempty(&Q))
  94.                      {
  95.                          DeleteQueue(&Q,&n);
  96.                          printf("%d ",n);
  97.                      }
  98.                      printf("\n");
  99.                      flag=0;
  100.                      break;
  101.             default:
  102.                      printf("非法命令!");
  103.                      break;
  104.         }
  105.     }

  106. }
当你第一次输入一个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,
接着单步调试,可是单步调试的时候是正确的。到现在还没弄清楚是为什么。。。


——————————————————————
还有一个关于杨辉三角的输出问题,这个是用了循环队列做的

点击(此处)折叠或打开

  1. include
  2. #include

  3. #define TRUE 1
  4. #define FALSE 0
  5. #define MAX 50
  6. typedef struct
  7. {
  8. int data[MAX];
  9. int front;
  10. int rear;
  11. }CircleQueue;

  12. //初始化
  13. void InitQueue(CircleQueue *Q)
  14. {
  15. Q->front=Q->rear=0;
  16. return;
  17. }

  18. //入队列
  19. int EnterQueue(CircleQueue *Q,int x,int N)
  20. {
  21. if((Q->rear 1)%N==Q->front)
  22. {
  23. printf("队列已满!\n");
  24. return FALSE;
  25. }
  26. Q->data[Q->rear]=x;
  27. Q->rear=(Q->rear 1)%N;
  28. return TRUE;
  29. }

  30. //出队列
  31. int DeleteQueue(CircleQueue *Q,int *x,int N)
  32. {
  33. if(Q->rear==Q->front)
  34. {
  35. printf("队列已空!\n");
  36. return FALSE;
  37. }
  38. *x=Q->data[Q->front];
  39. Q->front=(Q->front 1)%N;
  40. return *x;
  41. }

  42. int GetHead(CircleQueue *Q,int *x)
  43. {
  44. if(Q->rear==Q->front)
  45. {
  46. printf("无可取队列头!\n");
  47. return FALSE;
  48. }
  49. else
  50. {
  51. *x=Q->data[Q->front];
  52. return *x;
  53. }
  54. }

  55. int main()
  56. {
  57. int n,i,j;
  58. int N;
  59. int x,temp;
  60. CircleQueue Q;
  61. InitQueue(&Q);
  62. printf("请输入您想打印的行数:");
  63. scanf("%d",&N);
  64. EnterQueue(&Q,1,N);
  65. for(n=2;n{
  66. EnterQueue(&Q,1,N);
  67. for(i=1;i<=n-2;i )
  68. {
  69. DeleteQueue(&Q,&temp,N);
  70. printf("=",temp);
  71. GetHead(&Q,&x);
  72. temp=temp x;
  73. EnterQueue(&Q,temp,N);
  74. }
  75. DeleteQueue(&Q,&x,N);
  76. printf("=\n",x);
  77. EnterQueue(&Q,1,N);
  78. }
  79. while(Q.rear!=Q.front)
  80. {
  81. DeleteQueue(&Q,&x,N);
  82. printf("=",x);
  83. }
  84. printf("\n");
  85. return 0;
  86. }
这个程序在写的时候,关键是n的取值上,第一行只输出一个1就换行,中间的循环是输出除了第一个1和最后一个1之外,中间值的代码。

阅读(1310) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~