Chinaunix首页 | 论坛 | 博客
  • 博客访问: 837013
  • 博文数量: 489
  • 博客积分: 475
  • 博客等级: 下士
  • 技术积分: 3087
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 16:28
文章分类

全部博文(489)

文章存档

2013年(7)

2012年(301)

2011年(181)

分类:

2011-12-22 22:07:16

原文地址:队列应用编程 作者:luozhiyong131

  1. /**********************************************
  2. *文件名:
  3. * 功能:队列应用编程
  4. * 说明:实现队列的管理 插入 删除 遍历
  5. * 时间:2011-3-26                   --Lzy
  6. /**********************************************/

  7. #include <stdlib.h>
  8. #include <stdio.h>

  9. typedef struct node            /*节点类型*/
  10. {
  11.     int data;
  12.     struct node *next;
  13. }qnode;

  14. typedef struct pointer
  15. {
  16.     qnode *front;        /*队首指针*/
  17.     qnode *rear;        /*队尾指针*/
  18. }qpointer;

  19. void usage(void)        /*命令提示*/
  20. {
  21.     printf(" h 命令提示\n");
  22.     printf(" i 插入数据\n");
  23.     printf(" p 显示数据\n");    
  24.     printf(" d 删除数据\n");
  25.     printf(" q 程序退出\n");
  26. }

  27. void QueueInit(qpointer *qp)        /*队列初始化*/
  28. {
  29.     qnode *qn;
  30.     qn = (qnode *)malloc(sizeof(qnode));
  31.     qp->front = qn;
  32.     qp->front->next = NULL;
  33.     qp->rear = qp->front;    
  34. }

  35. int QueuePush(qpointer *qp, int x)        /*插入数据*/
  36. {
  37.     qnode *qn;
  38.     qn = (qnode *)malloc(sizeof(qnode));
  39.     qn->data = x;        /*数据输入*/
  40.     qn->next = NULL;
  41.     
  42.     qp->rear->next = qn;    /*调整原队列尾元素的指针域*/
  43.     qp->rear = qn;            /*调整队尾指针*/
  44.     
  45.     return 1;    
  46. }

  47. int IsEmpty(qpointer *qp)        /*判断队列是否为空*/
  48. {
  49.     if(qp->rear == qp->front)    /*队首指向队尾*/
  50.         return 1;
  51.     return 0;
  52. }

  53. int QueuePop(qpointer *qp, int *x)        /*删除数据*/
  54. {
  55.     qnode *qn;
  56. //    qn = (qnode *)malloc(sizeof(qnode));

  57.     
  58.     if(IsEmpty(qp))            /*判断队列是否为空*/
  59.         return 0;
  60.         
  61.     qn = qp->front->next;             
  62.     *x = qn->data;                /*数据读出*/    
  63.     
  64.     qp->rear->next = qn->next;        /*调整原队首指针*/
  65.     if(qp->rear == qn)                /*判断队列是否还有数据*/
  66.         qp->rear = qp->front;
  67.     free(qn);
  68.     
  69.     return 1;    
  70. }

  71. int main(void)
  72. {
  73.     int i;
  74.     char ch;
  75.     qpointer qp;
  76.     qnode *qn;    
  77.     usage();    /*输出帮助信息*/    
  78.     
  79.     QueueInit(&qp);        /*队列初始化*/
  80.     printf("\n > ");        /*输出命令提示符*/
  81.     
  82.     while(1)
  83.     {
  84.         scanf("%c",&ch);        /*获取命令字符*/
  85.         
  86.         if(ch == '\n')        /*过滤回车符*/
  87.         {
  88.             printf(" > ");
  89.             continue;
  90.         }
  91.         
  92.         switch(ch)
  93.         {
  94.             case 'p':
  95.                 qn = qp.front->next;
  96.                 printf("\n所有数据:\n");
  97.                 while(qn != NULL)
  98.                 {
  99.                     printf("%d\n",qn->data);
  100.                     qn = qn->next;
  101.                 }
  102.                 break;
  103.         
  104.             case 'd':
  105.                 QueuePop(&qp,&i);
  106.                 printf("\n删除的数据:%d\n\n",i);
  107.                 break;
  108.             
  109.             case 'i':
  110.                 printf("输入欲插入的数据:");
  111.                 scanf("%d",&i);
  112.                 QueuePush(&qp, i);
  113.                 break;                
  114.                 
  115.             case 'h':
  116.                 usage();
  117.                 break;
  118.                 
  119.             case 'q':
  120.                 printf("\n 程序已退出!!!\n\n");
  121.                 return 0;
  122.                 break;
  123.             
  124.             default:
  125.                 printf("\n 输入错误!!!\n\n");
  126.                 break;
  127.         }        
  128.     }
  129. }
阅读(635) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~