1 #include <stdio.h> 2 #include <stdlib.h> 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 }