源程序:(由于写得比较匆忙,注释写得不是很多,跟单链表的程序几乎是一样的原理)
// 3_a4.cpp —— 对链队列结构的定义
/*
* -> 程序要求:
* 1. 完成对链队列结构的定义,以及对链队列的各种基本运算的实现(每种基本运算用一个函数来实现)。
* 2. 基本运算包括:初始化Init_lkqueue运算、判队空Empty_lkqueue运算、入队En_lkqueue运算、出队De_lkqueue运算、取队头元素Gethead_lkqueue运算。
* 3. 并且在main函数中分别调用以上各种基本运算的函数来使用,以验证其功能已实现。
* 4. 此题的源程序保存为 3_a4.cpp。
**/
/*
* -> 程序分析:
* 1. 写链队列的定义,感觉就是带头结点的单链表的一个特例。
* 2. 入队,可以看作是单链表中的append操作。
* 3. 出队,是头结点后的第一个结点的删除。
* 4. 直接按单链表的方法写这个队列出来吧。
**/
#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;
template <typename elem> class lkqueue;
template <typename elem>
class lkqueuenode
{
friend class lkqueue<elem>;
private:
elem data;
lkqueuenode * next;
public:
lkqueuenode(elem d, lkqueuenode * n = NULL):data(d), next(n){}
lkqueuenode(lkqueuenode *n = NULL):next(n){}
};
template <typename elem>
class lkqueue
{
private:
lkqueuenode<elem> * head;
lkqueuenode<elem> * tail;
int size;
public:
lkqueue(){init();}
~lkqueue(){removeall();}
// 构造,析构
void init();
void removeall();
// 判空
bool isempty();
// 入队,取队,出队
void enlkqueue(const elem & nelem);
void getheadlkqueue(elem & gelem);
void delkqueue();
};
template <typename elem>
void lkqueue<elem>::init()
{
head = tail = new lkqueuenode<elem>;
size = 0;
return;
}
template <typename elem>
void lkqueue<elem>::removeall()
{
while ( head != NULL)
{
tail = head -> next;
delete head;
head = tail;
}
return;
}
template <typename elem>
bool lkqueue<elem>::isempty()
{
return size == 0;
}
template <typename elem>
void lkqueue<elem>::enlkqueue( const elem & pelem)
{
tail -> next = new lkqueuenode<elem> (pelem, tail -> next);
tail = tail -> next;
size++;
cout << "入队成功\n";
return;
}
template <typename elem>
void lkqueue<elem>::getheadlkqueue(elem &gelem)
{
if (!isempty())
{
gelem = head -> next -> data;
cout << "\n赋值成功!\n";
return;
}
cout << "\n该队为空,赋值失败!\n;";
return;
}
template <typename elem>
void lkqueue<elem>::delkqueue()
{
if (isempty())
{
cout << "\n该队为空,删除失败!\n";
return;
}
lkqueuenode<elem> * temp = head -> next;
head -> next = head -> next -> next;
delete temp;
cout << "\n出队成功。\n";
size--;
return;
}
int main()
{
cout << "-> 现在开始链式队列程序的测试...\n";
lkqueue<int> test;
cout << "-> 入队测试开始...\n";
for (int i = 1; i <= 10; ++i)
{
cout << "第 " << i << " 次: ";
test.enlkqueue(i);
cout << endl;
}
cout << "-> 取队头测试...\n";
int temp;
test.getheadlkqueue(temp);
cout << temp << "为所取值。";
cout << "-> 出队测试...\n";
for (int i = 1; i < 13; ++i)
{
cout << "第 " << i << " 次: ";
test.delkqueue();
cout << endl;
}
cout << "-> OK,所有测试完成! ";
system("pause");
return 0;
}
运行结果:
-> 现在开始链式队列程序的测试...
-> 入队测试开始...
第 1 次: 入队成功
第 2 次: 入队成功
第 3 次: 入队成功
第 4 次: 入队成功
第 5 次: 入队成功
第 6 次: 入队成功
第 7 次: 入队成功
第 8 次: 入队成功
第 9 次: 入队成功
第 10 次: 入队成功
-> 取队头测试...
赋值成功!
1为所取值。-> 出队测试...
第 1 次:
出队成功。
第 2 次:
出队成功。
第 3 次:
出队成功。
第 4 次:
出队成功。
第 5 次:
出队成功。
第 6 次:
出队成功。
第 7 次:
出队成功。
第 8 次:
出队成功。
第 9 次:
出队成功。
第 10 次:
出队成功。
第 11 次:
该队为空,删除失败!
第 12 次:
该队为空,删除失败!
-> OK,所有测试完成! 请按任意键继续. . .