免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1990 | 回复: 3
打印 上一主题 下一主题

[C] 一个队列操作实现中的getchar的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-22 01:15 |只看该作者 |倒序浏览
1可用积分

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define MAXNUM 40
  4. #define datatype int

  5. typedef struct queue{
  6.         int             queue[MAXNUM];
  7.         int             front;
  8.         int             rear;
  9. }queue;

  10. void initqueue(queue** p)
  11. {
  12.         *p = (queue* )malloc(sizeof(queue));

  13.         if(*p != NULL){
  14.                 (*p)->front = -1;
  15.                 (*p)->rear = -1;
  16.         }
  17. }

  18. void enqueue(queue** p, datatype x)//将x插入队尾
  19. {
  20.         if(((*p)->rear+1)%MAXNUM == (*p)->front){
  21.                 printf("the queue is full\n");
  22.         }

  23.         (*p)->rear = ((*p)->rear+1)%MAXNUM;
  24.         (*p)->queue[(*p)->rear] = x;
  25. }

  26. void delqueue(queue** p, datatype* x)//删除队列头元素,用x返回
  27. {
  28.         if((*p)->front == (*p)->rear){
  29.                 printf("the queue is empty\n");
  30.         }

  31.         (*p)->front = ((*p)->front+1)%MAXNUM;
  32.         *x = (*p)->queue[(*p)->front];
  33. }

  34. void firstqueue(queue** p, datatype* x)//返回队列头元素
  35. {
  36.         *x = (*p)->queue[(*p)->front];
  37. }

  38. void prqueue(queue** p)//打印队列元素
  39. {
  40.         int                     i;

  41.         for(i = (*p)->front; i <= (*p)->rear; i++){
  42.                 printf("%c", (*p)->queue[i]);
  43.         }
  44.         printf("\n");
  45. }

  46. int main(int argc, char** argv)
  47. {
  48.         queue*                  p;
  49.         int                     c;

  50.         initqueue(&p);

  51.         while((c = getchar()) !='\n'){
  52.                 enqueue(&p, c);
  53.         }

  54.         prqueue(&p);

  55.         delqueue(&p, &c);//删除一个头元素
  56.         printf("c = %c\n", c);

  57.         printf("\n");
  58.         enqueue(&p, 111);
  59.         prqueue(&p);

  60.         exit(0);
  61. }
复制代码

上面是简单的一个关于队列操作的实现
执行:
./a.out
1 2 3 4 5 6 //输入初始队列元素值

最佳答案

查看完整内容

你的队列是这样设计的,头指针指向第一个元素之前,尾指针指向最后一个元素。你的输出函数是这样的,输出头指针指向的元素,头指针指向的元素的后一个元素,...,直到最后一个元素。所以多了一个。在这个问题之外,你的输出函数仍有问题,因为 rear 可以比 front 小,你的 for 循环可能会在队列不空的情况下不输出。ps: 分就不要给我了,一分太少,拿了不好意思。

论坛徽章:
0
2 [报告]
发表于 2007-12-22 01:15 |只看该作者
你的队列是这样设计的,头指针指向第一个元素之前,尾指针指向最后一个元素。

你的输出函数是这样的,输出头指针指向的元素,头指针指向的元素的后一个元素,...,直到最后一个元素。所以多了一个。

在这个问题之外,你的输出函数仍有问题,因为 rear 可以比 front 小,你的 for 循环可能会在队列不空的情况下不输出。


ps: 分就不要给我了,一分太少,拿了不好意思。

论坛徽章:
0
3 [报告]
发表于 2007-12-22 10:04 |只看该作者
原帖由 win_hate 于 2007-12-22 09:14 发表
ps: 分就不要给我了,一分太少,拿了不好意思。

哈哈

论坛徽章:
0
4 [报告]
发表于 2007-12-22 16:38 |只看该作者

更改后的,不过牺牲了一个结点空间


  1. /*
  2. 该实现front始终指向当前的头结点,rear始终指向尾结点的
  3. 下一个结点
  4. */
  5. #include <stdio.h>
  6. #include <stdlib.h>

  7. #define MAXNUM 10
  8. #define datatype int

  9. typedef struct queue{
  10.         int             queue[MAXNUM];
  11.         int             front;
  12.         int             rear;
  13. }queue;

  14. void initqueue(queue** p)
  15. {
  16.         *p = (queue* )malloc(sizeof(queue));

  17.         if(*p != NULL){
  18.                 (*p)->front = 0;
  19.                 (*p)->rear = 0;
  20.         }
  21. }

  22. int emptyqueue(queue** p)
  23. {
  24.         int             val;

  25.         val = ((*p)->front == (*p)->rear);

  26.         return val;
  27. }

  28. void enqueue(queue** p, datatype x)//将x插入队尾
  29. {
  30.         if(((*p)->rear+1)%MAXNUM == (*p)->front){
  31.                 printf("the queue is full\n");
  32.                 return;
  33.         }

  34.         //(*p)->rear = ((*p)->rear+1)%MAXNUM;
  35.         (*p)->queue[(*p)->rear] = x;
  36.         (*p)->rear = ((*p)->rear+1)%MAXNUM;
  37. }

  38. void delqueue(queue** p, datatype* x)//删除队列头元素,用x返回
  39. {
  40.         if((*p)->front == (*p)->rear){
  41.                 printf("the queue is empty\n");
  42.                 return;
  43.         }

  44.         //(*p)->front = ((*p)->front+1)%MAXNUM;
  45.         *x = (*p)->queue[(*p)->front];
  46.         (*p)->front = ((*p)->front+1)%MAXNUM;
  47. }

  48. void firstqueue(queue** p, datatype* x)//返回队列头元素
  49. {
  50.         *x = (*p)->queue[(*p)->front];
  51. }

  52. void prqueue(queue** p)//打印队列元素
  53. {
  54.         int                     i;

  55.         i = (*p)->front;
  56.         while(i != (*p)->rear){
  57.                 printf("%c", (*p)->queue[i]);
  58.                 i = (i + 1) % MAXNUM;
  59.         }
  60.         //printf("%c", (*p)->queue[i]);
  61.         printf("\n");
  62. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP