Chinaunix首页 | 论坛 | 博客
  • 博客访问: 630954
  • 博文数量: 1008
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5175
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-31 09:44
文章分类
文章存档

2012年(1008)

我的朋友

分类:

2012-08-01 11:27:42

原文地址:队列 作者:luozhiyong131

  1. /* 队列 */
  2. #include <stdlib.h>
  3. #include <stdio.h>

  4. #define TRUE 1
  5. #define FALSE 0

  6. typedef struct node{                /* 节点类型 */
  7.   int data;
  8.   struct node *next;
  9. } qnode;

  10. typedef struct pointer {
  11.   qnode *front;                    /* 队首指针 */
  12.   qnode *rear;                    /* 队尾指针 */
  13. } qpointer;

  14. void usage()                    /* 函数使用方法 */
  15. {
  16.   printf("Usage:\n");
  17.   printf("p\t print the queue\n");
  18.   printf("i\t insert a node\n");
  19.   printf("d\t delete a node\n");
  20.   printf("q\t quit\n");
  21. }

  22. /*队列初始化*/
  23. void QueueInit(qpointer *qp)
  24. {
  25.     qnode *qn;
  26.     qn = (qnode *)malloc(sizeof(qnode));
  27.     qp->front = qn;
  28.     qp->front->next = NULL;
  29.     qp->rear = qp->front;
  30. }

  31. /*插入队列数据元素*/
  32. int QueuePush(qpointer *qp, int x)
  33. {
  34.     qnode *qn;
  35.     qn = (qnode *)malloc(sizeof(qnode));
  36.     if(qn == NULL)
  37.         return FALSE;
  38.     qn->data = x;
  39.     qn->next = NULL;
  40.     qp->rear->next = qn;
  41.     qp->rear = qn;
  42.     return TRUE;
  43. }

  44. /*队列是否为空*/
  45. int IsEmpty(qpointer *qp)
  46. {
  47.     if(qp->front == qp->rear)
  48.         return TRUE;
  49.     return FALSE;
  50. }

  51. /*删除队列数据元素*/
  52. int QueuePop(qpointer *qp, int *x)
  53. {
  54.     qnode *qn;
  55.     if(IsEmpty(qp))
  56.         return FALSE;
  57.     qn = qp->front->next;
  58.     *x = qn->data;
  59.     qp->front->next = qn->next;
  60.     if(qp->rear == qn)
  61.         qp->rear = qp->front;
  62.     free(qn);
  63.     return TRUE;
  64. }

  65. int main()
  66. {
  67.   char ch;
  68.   int x;
  69.   qnode *qn;
  70.   qpointer qp;
  71.   QueueInit (&qp);                /* 队列初始化 */
  72.   usage();                    /* 输出帮助信息 */
  73.   printf("> ");                    /* 输出提示符 */
  74.   while(1)
  75.   {
  76.     ch = getchar();                /* 获取命令字符 */
  77.     if(ch == '\n')                 /* 过滤命令字符后的回车符 */
  78.     {
  79.       printf("> ");
  80.       continue;
  81.     }
  82.     switch (ch)                 /* 根据命令字符,执行相应操作 */
  83.     {
  84.       case 'p':                 /* 输出队列中的各数据元素 */
  85.         qn = qp.front->next;
  86.         while(qn != NULL)
  87.         {
  88.           printf("%d ", qn->data);
  89.           qn=qn->next;
  90.         }
  91.         printf("\n");
  92.         break;
  93.       case 'i':                    /* 向队列中插入数据元素 */
  94.         printf("input the element:\n");
  95.         scanf("%d", &x);            /* 输入要插入的数据元素 */
  96.         QueuePush (&qp, x);
  97.         break;
  98.       case 'd':                    /* 删除数据元素 */
  99.         QueuePop (&qp, &x);
  100.         break;
  101.       case 'q':                    /* 退出程序 */
  102.         return 0;
  103.         break;
  104.       default:
  105.         ;
  106.     }
  107.   }
  108.   return 0;
  109. }
阅读(160) | 评论(0) | 转发(0) |
0

上一篇:栈 --C

下一篇:二叉树

给主人留下些什么吧!~~