1 #include
2 #include
3 typedef int ElemType;
4 typedef struct LinkNode{
5 ElemType data;
6 struct LinkNode *next;
7 }LinkNode;
8 //先进先出
9 typedef struct{
10 //链表头 链表尾
11 LinkNode *front,*rear;
12 }LinkQueue;
13 //链式队列的初始化
14 void InitQueue(LinkQueue &Q)
15 {
16 //头和尾指向同一个结点
17 Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
18 Q.front->next=NULL;
19 }
20 //判断队列是否为空
21 bool IsEmpty(LinkQueue Q)
22 {
23 if(Q.front==Q.rear) return true;
24 return false;
25 }
26 //入队
27 void EnQueue(LinkQueue &Q,ElemType x)
28 {
29 //创建新结点,插入到链尾
30 LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
31 s->data=x;
32 s->next=NULL;
33 Q.rear->next=s;
34 Q.rear=s;
35 }
36 //出队 头部删除法
37 bool DeQueue(LinkQueue &Q,ElemType &x)
38 {
39 //队列为空
40 if(Q.front==Q.rear) return false;
41 //头结点什么都没存,所以头结点的下一个节点才有数据
42 LinkNode *p=Q.front->next;
43 x=p->data;
44 //断链
45 Q.front->next=p->next;
46 //删除的是最后一个元素,则队列置为空
47 if(Q.rear==p) Q.rear=Q.front;
48 //释放删除节点的内存
49 free(p);
50 return true;
51 }
52 //队列的链式存储,部删除法,尾部插入法
53 int main()
54 {
55 LinkQueue Q;
56 bool ret;
57 ElemType element;//存储出队元素
58 InitQueue(Q);
59 EnQueue(Q,3);
60 EnQueue(Q,4);
61 EnQueue(Q,5);
62 EnQueue(Q,6);
63 EnQueue(Q,7);
64 ret=DeQueue(Q,element);
65 if(ret) printf("出队成功,元素值为 %d\n",element);
66 else printf("出队失败\n");
67 system("pause");
68 }