赞
踩
链式队列的实现思想同顺序队列类似,只需创建两个指针分别指向链表中队列的队头元素和队尾元素。
图所示为链式队列的初始状态,此时队列中没有存储任何数据元素,因此 top 和 rear 指针都同时指向头节点。
链队队列中,当有新的数据元素入队,只需进行以下 3 步操作:
由此,新节点就入队成功了。
例如,在上图的基础上,我们依次将 {1,2,3} 依次入队,各个数据元素入队的过程如下图所示:
当链式队列中,有数据元素需要出队时,按照 “先进先出” 的原则,只需将存储该数据的节点以及它之前入队的元素节点按照原则依次出队即可。这里,我们先学习如何将队头元素出队。
链式队列中队头元素出队,需要做以下 3 步操作:
例如,在上图的基础上,我们将元素 1 和 2 出队,则操作过程如下图所示:
总体代码:
- #include <iostream>
- #include <stdio.h>
- #include <stdlib.h>
- using namespace std;
- typedef struct LinkNode{
- int data;
- struct LinkNode *next;
- }LinkNode;
- typedef struct LinkQueue{
- LinkNode *fronts,*rear;
- }LinkQueue;
- //初始化
- int Init_LinkQueue(LinkQueue &Q)
- {
- Q.fronts=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
- Q.fronts->next==NULL;
- }
- //入队
- int EnQueue(LinkQueue &Q,int x)
- {
- LinkNode *s;
- s=(LinkNode*)malloc(sizeof(LinkNode));
- s->data=x;
- s->next=NULL;
- Q.rear->next=s;
- Q.rear=s;
- }
- //出队
- int DeQueue(LinkQueue &Q,int &x)
- {
- if(Q.fronts==Q.rear)
- return 0;
- LinkNode *q=Q.fronts->next;
- x=q->data;
- Q.fronts->next=q->next;
- if(Q.rear==q)
- {
- Q.rear=Q.fronts; //若原队列中仅有一个节点,删除后变空
- }
- free(q);
- return 1;
- }
- int show_Queue(LinkQueue Q)
- {
- Q.fronts=Q.fronts->next;
- while(Q.fronts!=NULL)
- {
- printf("%d ",Q.fronts->data);
- Q.fronts=Q.fronts->next;
- }
- }
- int main()
- {
- LinkQueue Q;
- Init_LinkQueue(Q);
- EnQueue(Q,1);
- EnQueue(Q,2);
- EnQueue(Q,3);
- show_Queue(Q);
- int a;
- DeQueue(Q,a);
- printf("%d\n",a);
- show_Queue(Q);
- cout << "Hello world!" << endl;
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。