1 /*
2 * 六、数据结构基础之链队列
3 * 链队列数据结构:
4 * 限制在表头删除和表尾插入的单链表
5 * --- 2012年4月29日 ---by lee
6 */
7
8 #ifndef _LINKED_QUEUE_H
9 #define _LINKED_QUEUE_H
10
11 #include "Utility.h"
12
13 //元素类型定义
14 typedef int DataType;
15
16 //链队列中结点结构的定义
17 typedef struct _QueueNode
18 {
19 DataType data;
20 struct _QueueNode *next;
21 } QueueNode;
22
23 //链队列结构的定义
24 typedef struct _LinkedQueue
25 {
26 QueueNode *front;//指向队列头结点的指针
27 QueueNode *rear;//指向队列尾结点的指针
28 } LinkedQueue;
29
30
31 //对链队列的基本操作
32
33 void InitQueue(LinkedQueue* queue);//初始化,构造空队
34 int IsQueueEmpty(LinkedQueue* queue);//判断队是否为空
35 void EnQueue(LinkedQueue* queue, DataType x);//元素x入队
36 DataType DeQueue(LinkedQueue* queue);//出队,返回队首元素
37 DataType QueueFront(LinkedQueue* queue);//取队首元素
38
39 //初始化,构造空队
40 void InitQueue(LinkedQueue* queue)
41 {
42 queue->front=queue->rear=NULL;
43 }
44
45 //判断队是否为空
46 int IsQueueEmpty(LinkedQueue* queue)
47 {
48 return ((NULL==queue->front) && (NULL==queue->rear));
49 }
50
51 //元素x入队
52 void EnQueue(LinkedQueue* queue, DataType x)
53 {
54 QueueNode *node=(QueueNode*)malloc(sizeof(QueueNode));
55 node->data=x;
56 node->next=NULL;
57 //判断是否是空队列
58 if(IsQueueEmpty(queue))
59 {
60 queue->rear=queue->front=node;
61 }
62 else
63 {
64 queue->rear->next=node;//非空队列,则在尾指针后插入
65 queue->rear=node;//队尾指针指向新的队尾
66 }
67 }
68
69 //出队,返回队首元素
70 DataType DeQueue(LinkedQueue* queue)
71 {
72 //判断是否是空队列
73 if(IsQueueEmpty(queue))
74 Error("Queue is empty");
75
76 QueueNode *p=queue->front;
77 DataType ret=p->data;
78 queue->front=p->next;
79 //判断是否只有一个结点
80 if(p==queue->rear)
81 queue->rear=NULL;//删除最后一个节点时,要修改尾指针
82 free(p);
83 p=NULL;
84 return ret;
85 }
86
87 //取队首元素
88 DataType QueueFront(LinkedQueue* queue)
89 {
90 if(IsQueueEmpty(queue))
91 Error("Queue is empty");
92
93 return queue->front->data;
94 }
95
96
97
98 #endif
99
100 //测试代码
101 /*
102 LinkedQueue q;
103 InitQueue(&q);
104 EnQueue(&q,1);
105 EnQueue(&q,2);
106 printf("Queue Front: %d\n",DeQueue(&q));
107 printf("Queue Front: %d\n",DeQueue(&q));
108 DeQueue(&q);
109 */