描述
用带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(不设头指针)。实现该队列的入队出队以及判断队列是否为空操作。
输入
多组数据,每组数据有两行。第一行为两个整数n和m,n表示入队序列A的长度(n个数依次连续入队,中间没有出队的情况),m表示出队序列B的元素数量(m个数依次连续出队,中间没有入队的情况)。第二行为序列A(空格分隔的n个整数)。当n和m都等于0时,输入结束。
输出
对应每组数据输出一行。每行包括m+1个整数,前m个数代表出队序列B的各个整数,最后一个整数表示队列是否为空,队列为空输出0,不为空输出1。整数之间用空格分隔。
输入样例 1
5 3
1 3 5 3 6
4 4
-1 2 3 4
0 0
输出样例 1
1 3 5 1 -1 2 3 4 0
思路:
使用链表,插入时使用尾插法。因为没有头节点,所以实际上用for循环输入链表信息的时候要少一次。并且在插入完毕后,记得让尾节点rear->next=l以实现循环。同时返回尾指针rear,省去下一次遍历的麻烦。
输出时,新建一个头指针,让头指针和尾指针都指向第一个元素,用i控制遍历次数输出。同时,如果出队的次数大于入队的次数,那么队列里的元素一定都输出过一次(”清空“)了,输出0,反之输出1。
代码:
#include<iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode* next;
}*linklist, LNode;
linklist Insert(linklist& l,int n)
{
l = new LNode;
l->next = NULL;
cin >> l->data;
linklist rear=l;
for (int i = 1; i < n; i++)
{
linklist p = new LNode;
cin >> p->data;
p->next = NULL;
rear->next = p;
rear = p;
}
rear->next = l;
return rear;
}
void Show(linklist rear,int n,int m)
{
linklist head = rear->next;
rear = rear->next;
int i = 0;
while (i!=m)
{
cout << rear->data << " ";
rear = rear->next;
i++;
}
if (m >= n)
cout << 0 << endl;
else
cout << 1 << endl;
}
int main()
{
int m, n;
while (cin >> n >> m && m != 0 && n != 0)
{
linklist l;
Show(Insert(l, n), n, m);
}
return 0;
}