(2011.10.31)3_a4.cpp —— 对链队列结构的定义

 

源程序:(由于写得比较匆忙,注释写得不是很多,跟单链表的程序几乎是一样的原理)

// 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,所有测试完成!    请按任意键继续. . .


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值