找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3390|回复: 0

链式队列的实现 |flying0033

[复制链接]
发表于 2011-12-24 14:34:11 | 显示全部楼层 |阅读模式
/*        队列是一种先进先出线性表,队列是线性表的特化        也具有线性表的性质分为:顺序队列与链式队列        链式队列与线性表的单链表相似只不过链式队列只        允许从头部进行删除、尾部进行插入.需要为链式队列        创建一个头结点包括两个指针,指向队头的指针(front)        与指向队尾的指针(rear).当两个指针相等时队列为空*/
  1. #ifndef LINKQUEUE_H
  2. #define LINKQUEUE_H
  3. typedef int ElemType;  //队列的数据类型
  4. typedef struct node{
  5.         ElemType data; //队列的数据类型
  6.         struct node *next; //指向下一个结点
  7. }QueNode,*QuePtr;
  8. typedef struct{
  9.         QuePtr front; //指向队头的指针
  10.         QuePtr rear; //指向队尾的指针
  11. }LinkQueue;
  12. void InitQueue(LinkQueue *q); //初始化队列
  13. void CreateQueue(LinkQueue *q); //创建队列
  14. void EnQueue(LinkQueue *q,ElemType e); //进队操作,将元素e压入队列中
  15. void DeQueue(LinkQueue *q,ElemType *e); //出队操作,将出队的元素存入*e中
  16. int GetQueueLength(LinkQueue *q); //获取队列的长度
  17. void Print(LinkQueue *q); //打印队列的元素
  18. void Clear(LinkQueue *q); //清空队列
  19. void TopQueue(LinkQueue *q,ElemType *e); //返回队头的元素
  20. #endif //LINKQUEUE_H
  21. #include "LinkQueue.h"
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. void InitQueue(LinkQueue *q) //初始化队列
  25. {
  26.         q->front = q->rear = (QuePtr)malloc(sizeof(QueNode)); //初始化队头与队尾的指针指向头结点
  27.         q->front->next = NULL;
  28. }
  29. void CreateQueue(LinkQueue *q) //创建队列
  30. {
  31.         InitQueue(q);
  32.         printf("请输入要进队的元素以CTRL+Z结尾\n");
  33.         int k;
  34.         while((scanf("%d",&k)) != EOF)
  35.                 EnQueue(q,k);
  36. }
  37. void EnQueue(LinkQueue *q,ElemType e) //将元素e进队
  38. {
  39.         QuePtr temp = (QuePtr)malloc(sizeof(QueNode)); //创建新结点
  40.         if(temp) //如果内存分配成功
  41.         {
  42.                 temp->data = e; //初始化新结点的数据为e
  43.                 temp->next = NULL; //队列只能从队尾插入所以下一个结点初始化为NULL
  44.                 q->rear->next = temp; //将队尾结点的指针指向新结点,如果新结点为第一个结点则q->rear->next相当于q->front->next
  45.                 q->rear = temp; //将指向队尾的指针指向新结点
  46.         }
  47. }
  48. void DeQueue(LinkQueue *q,ElemType *e) //队头的结点出队,将出队的结点的元素存入*e
  49. {
  50.         if(q->front == q->rear) //队列为空
  51.                 return;
  52.         QuePtr temp = q->front->next; //初始化temp为要出队的结点的指针
  53.         if(q->front->next == q->rear) //如果要出队的结点为最后一个结点,使q->rear指向头结点防止出现悬空的指针
  54.                 q->rear = q->front;
  55.         *e = temp->data; //将出队的数据元素存入*e
  56.         q->front->next = temp->next; //使下一个结点成为队头,如果没有下一个结点则为NULL
  57.         free(temp); //删除要出队的结点
  58. }
  59. bool IsEmpty(LinkQueue *q) //判断队列是否为空
  60. {
  61.         if(q->front == q->rear)
  62.                 return true;
  63.         return false;
  64. }
  65. int GetQueueLength(LinkQueue *q) //返回队列的长度
  66. {
  67.         QuePtr temp = q->front;
  68.         int i = 0;
  69.         while(temp != q->rear)
  70.         {
  71.                 ++i;
  72.                 temp = temp->next;
  73.         }
  74.         return i;
  75. }
  76. void Clear(LinkQueue *q) //清空队列
  77. {
  78.         QuePtr temp = q->front->next;
  79.         while(temp)
  80.         {
  81.                 QuePtr tp = temp;
  82.                 temp = temp->next;
  83.                 free(tp);
  84.         }
  85.         temp = q->front;
  86.         q->front = q->rear = NULL;
  87.         free(temp);
  88. }
  89. void Print(LinkQueue *q) //打印队列的元素
  90. {
  91.         if(q->front == q->rear)
  92.                 return;
  93.         QuePtr temp = q->front->next;
  94.         while(temp != q->rear)
  95.         {
  96.                 printf("%d ",temp->data);
  97.                 temp = temp->next;
  98.         }
  99.         printf("%d",temp->data);
  100.         printf("\n");
  101. }
  102. void TopQueue(LinkQueue *q,ElemType *e) //返回队头的结点元素存入*e
  103. {
  104.         if(q->front == q->rear)
  105.                 return;
  106.         *e = q->front->next->data;
  107. }       
  108. #include "LinkQueue.h"
  109. #include <stdio.h>
  110. int main()
  111. {
  112.         LinkQueue q;
  113.         CreateQueue(&q);
  114.         Print(&q);
  115.         int top;
  116.         TopQueue(&q,&top);
  117.         printf("队头的元素为:%d\n",top);
  118.         int len = GetQueueLength(&q);
  119.         int k;
  120.         printf("将队列中的所有元素出队:\n");
  121.         for(int i = 0;i < len;++i)
  122.         {
  123.                 DeQueue(&q,&k);
  124.                 printf("%d ",k);
  125.         }
  126.         printf("\n");
  127.         Clear(&q);               
  128.         return 0;
  129. }
复制代码
作者:flying0033 发表于2011-12-23 23:58:54 原文链接
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-22 17:06 , Processed in 0.018066 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表