链队是指采用链式存储结构实现的队列。通常链队用单链表来表示,如下图所示。一个链队显然需要两个分别指向队头和队尾的指针(分别称为头指针和尾指针)才能唯一确定。这里和线性表的单链表一样。为了操作方便起见,给链队添加一个头节点,并令头指针始终指向头结点。
下面是队列操作的指针变化状况
C++代码
#include<iostream>
using namespace std;
typedef struct qNode
{
int data;
struct qNode *next;
}qNode,*queue;
typedef struct
{
queue front;
queue rear;
} Linkqueue;
bool initqueue(Linkqueue &q)
{
q.front = q.rear = new qNode;//两指针指向同一结点
q.front->next = NULL;
return true;
}
void input(Linkqueue &q,queue &p,int num)
{
for( int i=0; i<num; i++ )
{
p = new qNode;
cin>>p->data;
cout<<"第"<<i+1<<"个入队的元素为"<<p->data<<endl;
p->next = NULL;
q.rear->next = p;
q.rear = p;
}
return ;
}
void output(Linkqueue &q,int num)
{
for( int i=0; i<num; i++ )
{
if( q.front->next==NULL )
{
cout<<"已没有元素可出队!"<<endl<<endl;
break;//当指针为空时,不能再指向下一结点。如果没有break,将不正常结束运行!
}
q.front = q.front->next;//在输出语句前是因为第一个是头结点
cout<<"第"<<i+1<<"个出队的元素为"<<q.front->data<<endl;
}
}
int main()
{
int num;
string s;
Linkqueue q;
queue l;
initqueue(q);
while( true )
{
cout<<"***你想要执行的操作(in/out *)及个数***"<<endl;
cin>>s>>num;
if( s=="in" )
input(q,l,num);
else if( s=="out" )
{
cout<<"\n出队列(先进先出)顺序如下(链式存储结构)\n\n";
output(q,num);
}
}
}
结果
***你想要执行的操作(in/out *)及个数***
in 1
2
第1个入队的元素为2
***你想要执行的操作(in/out *)及个数***
out 3
出队列(先进先出)顺序如下(链式存储结构)
第1个出队的元素为2
已没有元素可出队!
***你想要执行的操作(in/out *)及个数***
in 5
1
第1个入队的元素为1
5
第2个入队的元素为5
9
第3个入队的元素为9
6
第4个入队的元素为6
3
第5个入队的元素为3
***你想要执行的操作(in/out *)及个数***
out 3
出队列(先进先出)顺序如下(链式存储结构)
第1个出队的元素为1
第2个出队的元素为5
第3个出队的元素为9
***你想要执行的操作(in/out *)及个数***
in 2
7
第1个入队的元素为7
3
第2个入队的元素为3
***你想要执行的操作(in/out *)及个数***
out 5
出队列(先进先出)顺序如下(链式存储结构)
第1个出队的元素为6
第2个出队的元素为3
第3个出队的元素为7
第4个出队的元素为3
已没有元素可出队!
***你想要执行的操作(in/out *)及个数***
总的来说,链式队列实现队列循环比顺序队列效率要高且简单易懂。
代码写得还是比较基础,有任何错误或不妥的还请各位大佬指出,小弟洗耳恭听。
欢迎评论留言
转载需说明!