2009年3月15日星期日

一个自实现的链表形式的队列类

    RT,昨晚弄一个山寨版的链表堆栈类,由于对链表的本质理解不透彻,所以昨晚的代码写的是比较烂的

    经过一段时间的领悟之后,渐渐有了眉目,其实就是这个拉~可以说,这次的代码写的比上次好些~

    对于链表的一些周边认识请参考:

    好了,发代码吧(KC我下午是翘了学校的自习时间的……这周要月考……)

CODE:

/**************************************************

** Project:LinkList-Queue

** File:CQueue.h

** Edition:v1.0.0 Demo

** Coder:KingsamChen [MDSA Group]

** Last Modify:2009-3-15

**************************************************/

#pragma once

template<typename T>
class CNode
{
  
public:
    
T m_Data;
    
CNode<T> *m_pNext;
};



template<typename T>
class CQueue
{
  
public:
    
CQueue();  
    ~
CQueue();
    
void Enqueue(const &item);
    
T Dequeue();
    
T QFront();
    
bool IsQueueEmpty();
    
void ClearQueue();

  
private:
    
CNode<T> *m_pFront;
    
CNode<T> *m_pRear;
    
int m_nSize;
};



/**************************************************

** Project:LinkList-Queue

** File:CQueue.cpp

** Edition:v1.0.0 Demo

** Coder:KingsamChen [MDSA Group]

** Last Modify:2009-3-15

**************************************************/

#include "CQueue.h"
#include <iostream>
#include <conio.h>
#include <tchar.h>
#include <crtdbg.h>
using namespace std;

#ifdef _UNICODE
  
#define _terr std::wcerr
  
#define _tout std::wcout
#else
  #define 
_terr std::cerr
  
#define _tout std::cout
#endif



//=========================================
// 函数名: CQueue
// 输  入: -
// 输  出: -
// 功  能: 构造函数
//=========================================
template<typename T>
CQueue<T>::CQueue() : m_nSize(0), m_pFront(NULL), m_pRear(NULL)
{
  
// just for initialization
}



//=========================================
// 函数名: ~CQueue
// 输  入: -
// 输  出: -
// 功  能: 析构函数
//=========================================
template<typename T>
CQueue<T>::~CQueue()
{
  
ClearQueue();
}



//=========================================
// 函数名: Enqueue
// 输  入: item(const T&) - 入队的元素
// 输  出: -
// 功  能: 将元素入队
//=========================================
template<typename T>
void CQueue<T>::Enqueue(const &item)
{
  
// 为入队的新元素分配空间
  
CNode<T> *pNewNode new CNode<T>;

  
if (!pNewNode)
  {
    
_terr<<_T("Create new node failed!\n")<<endl;
    
getch();
    
exit(1);
  }

  
// 设置元素在队列中的位置
  
pNewNode->m_Data item;
  
pNewNode->m_pNext NULL;

  
// 讨论队首指针是否指向NULL
  // 因为在已有元素的情况下,队首指针位置和元素入队无关
  
if (NULL == m_pFront)
  {
    
m_pFront pNewNode;
  }
  
else
  
{
    
m_pRear->m_pNext pNewNode;
  }

  
m_pRear pNewNode;
  
  
// 长度增加
  
m_nSize++;
}



//=========================================
// 函数名: Dequeue
// 输  入: -
// 输  出: T - 队首元素
// 功  能: 将队首元素出队
//=========================================
template<typename T>
T CQueue<T>::Dequeue()
{
  
// 空队列
  
if (NULL == m_pFront)
  {
    
_terr<<_T("Cannot operated with a empty queue!\n")<<endl;
    
getch();
    
exit(1);
  }

  
// 保存元素
  
T tmp m_pFront->m_Data;
  
CNode<T> *pTmp m_pFront;
  
  
// 把队首指针移位
  
m_pFront m_pFront->m_pNext;

  
delete pTmp;
  
m_nSize--;

  
return tmp;
}



//=========================================
// 函数名: IsQueueEmpty
// 输  入: -
// 输  出: bool - 空:trueE, 非空:false
// 功  能: 判断是否为空队列
//=========================================
template<typename T>
bool CQueue<T>::IsQueueEmpty()
{
  
return (NULL == m_pFront) ? true false;
}



//=========================================
// 函数名: ClearQueue
// 输  入: -
// 输  出: -
// 功  能: 清理链表占据的空间
//=========================================
template<typename T>
void CQueue<T>::ClearQueue()
{
  
while (m_pFront)
  {
    
CNode<T> *pTmp m_pFront;
    
m_pFront m_pFront->m_pNext;
    
delete pTmp;
  }
}

没有评论:

发表评论

1、可以使用<b>、<i>、<a>等Html标志,让评论更有特色...
2、支持OpenID登录,技术达到国际先进水平。但切记,评论内容不代表本站观点!
3、当遇到“连接被重置”、“连接超时”和“此网页无法访问”等而发表不了评论的话,请多刷新几次页面,或迟三分钟后再试;
4、对你的浏览造成不便,站长在此代表全国G.FW工作人员向你鞠躬致歉!!!