您的位置:首页 > 理论基础 > 数据结构算法

数据结构(7) 链队列 c++ 模板实现

2013-07-23 00:43 751 查看
[b]链队列

[/b]

1、 链队列的定义

 队列的链式存储结构简称为链队列。它是限制仅在表头删除和表尾插入的单链表。

2、 链队列的结构类型说明





//QueueNode.h
template <typename Type> class LinkQueue;
template <typename Type> class QueueNode
{
private:
friend class LinkQueue<Type>;
Type m_data;
QueueNode *m_pnext;
private:
QueueNode():m_pnext(NULL){};
QueueNode(Type item,QueueNode<Type> *pnext=NULL):m_data(item),m_pnext(pnext){};
~QueueNode()
{m_pnext=NULL;}
public:
Type Getdata();
};

template <typename Type> Type QueueNode<Type>::Getdata()
{
return m_data;
}


//LinkQueue.h
#include "QueueNode.h"

template <typename Type> class LinkQueue
{
private:
QueueNode<Type> *m_prear;
QueueNode<Type> *m_pfront;
int m_count;
public:
LinkQueue():m_prear(NULL),m_pfront(NULL),m_count(0){};
~LinkQueue()
{
ClearQueue();
delete m_prear;
delete m_pfront;
}
public:
bool IsEmpty();
void ClearQueue();
int Length();
bool Append(Type item);
Type Delete();
Type Peek();
void Print();
};

template <typename Type> bool LinkQueue<Type>::IsEmpty()
{
return m_pfront==NULL;
}

template <typename Type> int LinkQueue<Type>::Length()
{return m_count;}

template <typename Type> bool LinkQueue<Type>::Append(Type item)
{
if(IsEmpty())
m_pfront=m_prear=new(nothrow) QueueNode<Type>(item) ;
else m_prear=m_prear->m_pnext=new(nothrow) QueueNode<Type>(item) ;//m_prear->m_pnext是之前的最末结点
++m_count;
return true;
}

template <typename Type> Type LinkQueue<Type>::Delete()
{
if(IsEmpty())
{cout<<"The Queue is Empty!"<<endl;
return NULL;}
QueueNode<Type> *m_ptemp=m_pfront;
Type temp=m_ptemp->m_data;
m_pfront=m_pfront->m_pnext;
delete m_ptemp;
--m_count;
return temp;
}

template <typename Type> Type LinkQueue<Type>::Peek()
{
return m_pfront->m_data;
}

template <typename Type> void LinkQueue<Type>::ClearQueue()
{
QueueNode<Type> *pdel;

while(m_pfront!=NULL)
{	pdel=m_pfront;
m_pfront=m_pfront->m_pnext;
delete pdel;
}
m_prear=NULL;
m_count=0;
}

template <typename Type> void LinkQueue<Type>::Print()
{
QueueNode<Type> *pmove=m_pfront;
cout<<"front";
while(pmove!=NULL)
{
cout<<"--->"<<pmove->m_data;
pmove=pmove->m_pnext;
}
cout<<"--->rear"<<endl;
}


// LinkQueue.cpp

#include "stdafx.h"
#include"LinkQueue.h"
#include<iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
//测试代码
FILE *pOut(nullptr);
errno_t err = freopen_s( &pOut, "debug_output.txt", "w", stdout );

if(err)
cout << "error on freopen" << endl;

// Turn on free store debugging and leak-checking bits
_CrtSetDbgFlag( _CRTDBG_LEAK_CHECK_DF|_CRTDBG_ALLOC_MEM_DF );

// Direct warnings to stdout
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);

LinkQueue<int> queue;
int init[10]={1,3,6,8,9,2,0,5,4,7};

for(int i=0;i<10;i++){
queue.Append(init[i]);
}
queue.Print();

queue.Delete();
queue.Print();
cout<<queue.Length()<<endl;
cout<<queue.Peek()<<endl;
queue.Print();

queue.ClearQueue();
queue.Print();

queue.Delete();

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: