二叉排序树的查找插入删除等操作

  • Post author:
  • Post category:其他







1


小题


二叉排序树的操作,实现如下6个功能:






1


)设计思路


要求建立一棵二叉排序树:对从键盘输入的顺序任意的若干个正整数建立一颗二叉排序树,以-1作为结束。


例如:输入 39 11 68 46 75 23 71 8 86 34 -1


插入一个数据,首先使用find函数判断这个数据是不是已经存在了,已经存在的数据不能再插入。同时,find函数会返回被查结点的双亲f,如果没查找到,则f就是待插入的结点的双亲。


若这个数据未存在,判断要插入的位置。


先判断是否是空树,如果是空树,则插入到根结点,否则判断是待插入位置的结点的左孩子还是右孩子


  1. 源代码






3


)说明


(请说明上述源代码是否应用测试程序进行测试并得到正确结果,如果存在错误,请描述错误并适当分析错误可能发生的原因)


已经用测试程序进行测试,并得到正确结果。






2


小题


  1. 设计思路


要求中序遍历,输出遍历结果。


(阐述通过分析问题得到解决方案的思考过程)


使用之前实验的中序遍历的算法就好了






2


)源代码


(请在源代码中添加注释,对变量含义、代码含义进行适当说明)






3


)说明


(请说明上述源代码是否应用测试程序进行测试并得到正确结果,如果存在错误,请描述错误并适当分析错误可能发生的原因)


已经用测试程序进行测试,并得到正确结果。






3


小题






1


)设计思路


(阐述通过分析问题得到解决方案的思考过程)


要求输入一个关键字,进行查找。


参数列表为数据元素,所以重载一个参数列表为数据元素类型的find函数。


从根结点开始比较,如果等于key则查找成功,用一个标志存储temp查找结果,查找到了temp就等于1.


如果key大于根结点的值,则到左子树中查找,小于则到右子树时查找,当p为空或查到找key时,查找结束






2


)源代码


(请在源代码中添加注释,对变量含义、代码含义进行适当说明)






3


)说明


(请说明上述源代码是否应用测试程序进行测试并得到正确结果,如果存在错误,请描述错误并适当分析错误可能发生的原因)


已经用测试程序进行测试,并得到正确结果。






4


小题






1


)设计思路


(阐述通过分析问题得到解决方案的思考过程)


要求输入一个关键字,进行插入。


同(1),使用插入函数就好






2


)源代码


(请在源代码中添加注释,对变量含义、代码含义进行适当说明)






3


)说明


(请说明上述源代码是否应用测试程序进行测试并得到正确结果,如果存在错误,请描述错误并适当分析错误可能发生的原因)


已经用测试程序进行测试,并得到正确结果。






5


小题






1


)设计思路


删除:输入一个关键字,进行删除。


要删除二叉排序树中的p结点,分三种情况:

  1. p为叶子结点,只需修改p双亲f的指针f->leftchild=NULL或f->rightchild=NULL;
  2. p只有左子树或右子树


p只有左子树,用p的左孩子代替p


p只有右子树,用p的右孩子代替p

  1. p左、右子树均非空,


在p的左子树中寻找关键字值最大的数据元素(中序遍历中最后一个被访问的数据元素) x,用x的值代替被删除数据元素的值,再来删除数据元素x(x没有右子树);


据此,设计出参数列表为BinTreeNode *类型的Delete函数。题目要求所删元素类型为数据元素类型,所以还需要再重载一个参数列表为ElemType类型的函数。


重载后,使用find(key,*f)函数,利用f得到待删结点的双亲结点,再判断待删结点是双亲结点的左孩子还是右孩子。


若待删结点无双亲,则待删结点为根结点,则需要删除根结点。






2


)源代码






3


)说明


(请说明上述源代码是否应用测试程序进行测试并得到正确结果,如果存在错误,请描述错误并适当分析错误可能发生的原因)


已经用测试程序进行测试,并得到正确结果。






6


小题






1


)设计思路


(阐述通过分析问题得到解决方案的思考过程)


要求编写递归算法,从大到小输出关键字不小于x的数据元素。


定义一个PrintNLT(BinarySortTree<int> &tree, BinTreeNode<int> *p, int boundary)函数,作用是输出以p为根结点的树中,比boundary值大的元素。


由于需要从大到小输出,所以


若p有右孩子,则以p的右孩子为根调用PrintNLT函数,这样就可以输出p的右子树中比boundary大的元素


再判断p的元素是否大于等于boundary,符合则输出


若p有左子树,最后再递归地调用PrintNLT输出左子树中比boundary大的元素就好了






2


)源代码


(请在源代码中添加注释,对变量含义、代码含义进行适当说明)






3


)说明


(请说明上述源代码是否应用测试程序进行测试并得到正确结果,如果存在错误,请描述错误并适当分析错误可能发生的原因)


已经用测试程序进行测试,并得到正确结果。


源代码:

#include <iostream>
using namespace std;
#include "status.h"
#include "Node.h"
#include "LinkQueue.h"
#include "BinTreeNode.h"
#include "BinarySortTree.h"
BinTreeNode<int> *FindBoundary(BinTreeNode<int> *p, int boundary);
template <class Elemtype>
void Display(const Elemtype e)
{
	cout << e << " ";
}
void PrintNLT(BinarySortTree<int> &tree, BinTreeNode<int> *p, int boundary) //输出以p为根的子树中大于boundary的结点
{
	//先从p的左右子树中输出
	if (p->rightChild)
	{
		PrintNLT(tree, p->rightChild, boundary);
	}
	// 右子树比较完,比较p
	if (p->data >= boundary)
		cout << p->data << " ";
	// p比较完,比较p的左子树
	if (p->leftChild)
		PrintNLT(tree, p->leftChild, boundary);
}
BinTreeNode<int> *FindBoundary(BinTreeNode<int> *p, int boundary) //在以p结点为根的子树中寻找临界结点
{
	//中序寻找temp结点,temp->leftChild < boundary <= temp
	if (boundary <= p->data) // p结点的值不小于boundary时,从左子树中寻找临界结点,不存在返回p
	{
		//左子树为空:这个结点就是所要寻找的临界结点
		if (p->leftChild == NULL)
		{
			cout << p->data << "shuaige1" << endl;
			return p;
		}

		//左子树不为空:在它的左子树中寻找临界结点
		else
		{
			//如果左子树中有临界结点
			BinTreeNode<int> *temp = FindBoundary(p->leftChild, boundary);
			if (temp)
			{
				cout << p->data << "shuaige2" << endl;
				return temp;
			}

			//如果没有,返回p
			else
			{
				cout << p->data << "shuaige3" << endl;
				return p;
			}
		}
	}
	else // p->data 小于 boundary时,从右子树中寻找boundary,不存在说明没有结点比boundary大,返回NULL
	{
		//右子树不存在,说明这个子树中没有结点比boundary大
		if (p->rightChild == NULL)
			return NULL;
		//右子树不为空,从右子树中寻找boundary,如果能找到boundary,return,都比boundary小,return NULL
		else
		{
			//右子树大于等于boundary,则右子树就是临界结点
			BinTreeNode<int> *temp = FindBoundary(p->rightChild, boundary);
			if (temp)
			{
				cout << p->data << "shuaige3" << endl;
				return temp;
			}

			//如果没有,返回p
			else
				return NULL;
		}
	}
}
int main(void)
{
	BinarySortTree<int> tree;
	int data;
	//建立二叉排序树
	cout << "Please enter 10 integers, ending with -1(39 11 68 46 75 23 71 8 86 34 -1):" << endl; //输入:39 11 68 46 75 23 71 8 86 34 -1
	cin >> data;
	while (data != -1)
	{
		tree.Insert(data); //-----------二叉排序树插入
		cin >> data;
	}
	//中序遍历二叉排序树
	cout << "The inorder sequence of the binary sorting tree is:" << endl;
	tree.InOrder(Display); //-----------二叉排序树中序遍历
	cout << endl;
	//查找
	cout << "Please enter the data to be searched(39):" << endl;
	cin >> data;		 //输入:39
	if (tree.Find(data)) //-----------二叉排序树查找
		cout << "Search Successfully!" << endl;
	else
		cout << "Not Found!" << endl;
	//插入
	cout << "Please enter the data to be inserted(55):" << endl;
	cin >> data;		   //输入:55
	if (tree.Insert(data)) //-----------二叉排序树插入
		cout << "Insert successfully!" << endl;
	else
		cout << "Insert unsuccessfully!" << endl;
	cout << "The inorder sequence of the binary sorting tree is:" << endl;
	tree.InOrder(Display);
	cout << endl;

	//删除
	cout << "Please enter the data to be deleted(71):" << endl;
	cin >> data;		   //输入:71
	if (tree.Delete(data)) //-----------二叉排序树删除
	{
		cout << "Delete successfully!" << endl;
	}
	else
		cout << "Delete unsuccessfully!" << endl;
	cout << "The inorder sequence of the binary sorting tree is:" << endl;
	tree.InOrder(Display);
	cout << endl;

	//从大到小输出关键字不小于x的数据元素
	cout << "Please enter a data as a boundary(34):" << endl;
	cin >> data; //输入:34
	cout << "Data greater than the boundary " << data << " include:" << endl;
	PrintNLT(tree, tree.GetRoot(), data); //-----------降序输出不小于data的所有元素
	cout << endl;

	system("pause");
	return 0;
}
#pragma once
#include "BinTreeNode.h"
template <class ElemType>
class BinarySortTree
{
protected:
    BinTreeNode<ElemType> *root;
    void Destroy(BinTreeNode<ElemType> *&r);                                                       //删除以r为根的二叉树
    void PreOrder(BinTreeNode<ElemType> *r, void (*Visit)(const ElemType &)) const;                //先序遍历以r为根的二叉树
                                                                                                   //中序遍历以r为根的二叉树
    void PostOrder(BinTreeNode<ElemType> *r, void (*Visit)(const ElemType &)) const;               //后序遍历以r为根的二叉树
    int Height(const BinTreeNode<ElemType> *r) const;                                              //求以r为根的二叉树的高度
    int NodeCount(const BinTreeNode<ElemType> *r) const;                                           //求以r为根的二叉树的结点个数                          //在以r为根的二叉树中求p的双亲
    BinTreeNode<ElemType> *Parent(BinTreeNode<ElemType> *r, const BinTreeNode<ElemType> *p) const; //在以r为根的二叉树中求p的双亲
public:
    void InOrder(BinTreeNode<ElemType> *r, void (*Visit)(const ElemType &)) const;
    bool Delete(const ElemType e);
    void Delete(BinTreeNode<ElemType> *&p);
    BinTreeNode<ElemType> *Find(const ElemType &key, BinTreeNode<ElemType> *&f) const;
    bool Find(const ElemType &key) const;
    bool Insert(const ElemType &e);
    BinarySortTree();
    BinarySortTree(const ElemType &e);
    ~BinarySortTree();
    BinTreeNode<ElemType> *GetRoot() const;
    bool IsEmpty() const;
    Status GetElem(BinTreeNode<ElemType> *p, ElemType &e) const;
    Status SetElem(BinTreeNode<ElemType> *p, const ElemType &e);
    void InOrder(void (*Visit)(const ElemType &)) const;    //中序遍历整棵二叉树
    void PreOrder(void (*Visit)(const ElemType &)) const;   //先序遍历整棵二叉树
    void PostOrder(void (*Visit)(const ElemType &)) const;  //后序遍历整棵二叉树
    void LevelOrder(void (*Visit)(const ElemType &)) const; //层序遍历整棵二叉树
    int NodeCount() const;
    void CreateBinaryTree();
    int Depth() const;
    int depth(BinTreeNode<ElemType> *rt) const;
    int CountLeaf(BinTreeNode<ElemType> *rt) const;
    int Width() const;
    int width(LinkQueue<BinTreeNode<ElemType> *> &q, int &maxWidth, int wid) const;
    int CtLeaf(LinkQueue<BinTreeNode<ElemType> *> &q, int &count) const;
    // void PrintNLT(BinarySortTree tree,BinTreeNode<ElemType> *root,ElemType boundary) const;
};

template <class ElemType>
bool BinarySortTree<ElemType>::Delete(const ElemType e)
{
    BinTreeNode<ElemType> *p, *f;
    if (Find(e, p)) //等于e的结点存在
    {
        // e的双亲结点不存在,p==NULL
        if (p == NULL)
        {
            Delete(root);
        }
        // e的双亲结点存在
        else
        {
            //左子树是否存在
            if (p->leftChild)
            {
                if (p->leftChild->data == e)
                {

                    Delete(p->leftChild);
                    return true;
                }
                else
                {
                    Delete(p->rightChild);
                    return true;
                }
            }
            //左子树不存在就一定是右子树
            else
            {
                Delete(p->rightChild);
                return true;
            }
        }
    }
    else //结点不存在,也算作删除成功
        return true;
}
template <class ElemType>
void BinarySortTree<ElemType>::Delete(BinTreeNode<ElemType> *&p)
{
    BinTreeNode<ElemType> *tmpPtr, *tmpF;
    if (p->leftChild == NULL && p->rightChild == NULL) // p为叶子结点
    {
        delete p;
        p = NULL;
    }
    else if (p->leftChild == NULL) // p的左子树为空,右孩子代替自己
    {
        tmpPtr = p;
        p = p->rightChild;
        delete tmpPtr;
    }
    else if (p->rightChild == NULL) // p的右子树为空,左孩子代替自己
    {
        tmpPtr = p;
        p = p->leftChild;
        delete tmpPtr;
    }
    else
    { // p左右子树都在,采用前述方案一
        tmpF = p;
        tmpPtr = p->leftChild;
        while (tmpPtr->rightChild != NULL) //寻找p的左子树中关键字最大的结点
        {
            tmpF = tmpPtr;
            tmpPtr = tmpPtr->rightChild;
        }                       // p代表双亲结点的孩子指针,修改p就是修改双亲结点的孩子指针!
        p->data = tmpPtr->data; //将tmpPtr结点的数据值赋值给待删结点
        //删除tmpPtr结点
        if (tmpF->rightChild == tmpPtr)
            Delete(tmpF->rightChild);
        else //待删结点p左子树中只有一个结点,tmpF==p,tmpPtr==tmpF->leftChild
            Delete(tmpF->leftChild);
    }
}
template <class ElemType>
bool BinarySortTree<ElemType>::IsEmpty() const
{
    if (root == NULL)
        return true;
    else
        return false;
}
template <class ElemType>
bool BinarySortTree<ElemType>::Insert(const ElemType &e)
{
    BinTreeNode<ElemType> *f; //指向被查找结点的双亲
    if (Find(e, f) == NULL)
    { //待插元素不存在,进行插入
        BinTreeNode<ElemType> *p;
        p = new BinTreeNode<ElemType>(e); //新建一个结点
        if (IsEmpty())
            root = p; //空树
        else if (e < f->data)
            f->leftChild = p; //插入为左孩子
        else
            f->rightChild = p; //插入为右孩子
        return true;
    }
    return false; //待插元素已存在,插入失败
}
template <class ElemType>
BinTreeNode<ElemType> *BinarySortTree<ElemType>::Find(const ElemType &key, BinTreeNode<ElemType> *&f) const
{
    BinTreeNode<ElemType> *p = GetRoot(); //获取当前根结点
    f = NULL;                             //指向p结点的双亲结点
    while (p != NULL && p->data != key)
    {
        if (key < p->data)
        {
            f = p;
            p = p->leftChild;
        }
        else
        {
            f = p;
            p = p->rightChild;
        }
    }
    return p;
}
template <class ElemType>
bool BinarySortTree<ElemType>::Find(const ElemType &key) const
{
    BinTreeNode<ElemType> *p = GetRoot(); //获取当前根结点
    int temp = 0;//是否查找到的标志
    while (p != NULL)
    {
        if (p->data == key)//p等于key,表示查找到,程序结束
        {
            temp = 1;
            break;
        }
            
        if (key < p->data)//比key大则在左子树中查找
        {
            p = p->leftChild;
        }
        else//比key小则在右子树中查找
        {
            p = p->rightChild;
        }
    }
    if (temp == 0)
        return false;
    if (temp == 1)
        return true;
}
template <class ElemType>
int BinarySortTree<ElemType>::CtLeaf(LinkQueue<BinTreeNode<ElemType> *> &q, int &count) const
{
    BinTreeNode<ElemType> *t;
    q.DelQueue(t);
    if (t->leftChild == NULL && t->rightChild == NULL)
        count++; //如果没有左右子树,则为叶子
    //有左右子树时,将左右子树加入到队列中去
    if (t->leftChild != NULL)
        q.EnQueue(t->leftChild);
    if (t->rightChild != NULL)
        q.EnQueue(t->rightChild);
    if (q.IsEmpty()) //当队列为空时,递归结束
        return count;
    else
        CtLeaf(q, count);
}
template <class ElemType>
int BinarySortTree<ElemType>::CountLeaf(BinTreeNode<ElemType> *rt) const
{
    LinkQueue<BinTreeNode<ElemType> *> q;
    int count = 0;
    if (root != NULL)
        q.EnQueue(root);
    CtLeaf(q, count);
    // int count = 0;
    // //层序遍历二叉树,若一个结点没有左右子树,则为叶子
    // LinkQueue<BinTreeNode<ElemType> *> q;
    // BinTreeNode<ElemType> *t;
    // if (root != NULL)
    //     q.EnQueue(root);
    // while (!q.IsEmpty())
    // {
    //     q.DelQueue(t);
    //     if (t->leftChild == NULL && t->rightChild == NULL)
    //         count++; //如果没有左右子树,则为叶子
    //     if (t->leftChild != NULL)
    //         q.EnQueue(t->leftChild);
    //     if (t->rightChild != NULL)
    //         q.EnQueue(t->rightChild);
    // }
    return count;
}

template <class ElemType>
int BinarySortTree<ElemType>::width(LinkQueue<BinTreeNode<ElemType> *> &q, int &maxWidth, int wid) const
{
    //根据上一层的结点,可以计算出这层的结点个数,结点放在队列中,q队列中保存上一层的结点
    // wid为上一层的结点数目
    BinTreeNode<ElemType> *t;
    int num = 0; //记录本层结点数
    for (int i = 0; i < wid; i++)
    {
        q.DelQueue(t);
        if (t->leftChild != NULL)
        {
            num++;
            q.EnQueue(t->leftChild);
        }
        if (t->rightChild != NULL)
        {
            num++;
            q.EnQueue(t->rightChild);
        }
    }
    if (num > maxWidth)
        maxWidth = num;
    if (q.IsEmpty()) //递归结束条件为队列为空
    {
        return maxWidth;
    }
    width(q, maxWidth, num); //递归作用为循环
}
template <class ElemType>
int BinarySortTree<ElemType>::Width() const
{
    LinkQueue<BinTreeNode<ElemType> *> q;
    int maxWidth = 1;
    if (root != NULL)
        q.EnQueue(root);
    width(q, maxWidth, maxWidth);
    return maxWidth;
}

// template <class ElemType>
// int BinarySortTree<ElemType>::Width() const
// {
//     //每遍历一层,返回本层的宽度
//     LinkQueue<BinTreeNode<ElemType> *> q;
//     int width = 0, n = 0, m;//width为最大宽度,n记录上一层的结点数,m为本层结点数
//     BinTreeNode<ElemType> *t;
//     if (root != NULL)
//     {
//         q.EnQueue(root);
//         width = 1;
//         n = 1;
//     }
//     while (!q.IsEmpty())//队列为空时结束循环
//     {
//         m = 0;//记录本层结点数
//         for (int i = 0; i < n; i++)//将上一层n个结点依次出队
//         {
//             q.DelQueue(t);
//             if (t->leftChild != NULL)
//             {
//                 m++;
//                 q.EnQueue(t->leftChild);
//             }
//             if (t->rightChild != NULL)
//             {
//                 m++;
//                 q.EnQueue(t->rightChild);
//             }
//         }
//         n = m;//上一层结点已经全部出队,n记录结点数
//         if (n > width)
//             width = n;
//     }
//     return width;
// }

template <typename ElemType>
int BinarySortTree<ElemType>::depth(BinTreeNode<ElemType> *rt) const
{
    //二叉树的深度等于左右子树深度中较大值+1,为空树时深度为0

    int wid = 0;
    if (rt == NULL)
        return wid;
    else
    {
        if ((width(rt->leftChild) > width(rt->rightChild)))
            wid = width(rt->leftChild) + 1;
        else
            wid = width(rt->rightChild) + 1;
        return wid;
    }
}
template <typename ElemType>
int BinarySortTree<ElemType>::Depth() const
{
    return depth(root);
}

template <typename ElemType>
BinTreeNode<ElemType> *BinarySortTree<ElemType>::GetRoot() const
{
    return root;
}

template <class ElemType>
void BinarySortTree<ElemType>::PreOrder(BinTreeNode<ElemType> *r, void (*Visit)(const ElemType &)) const
{
    if (r != NULL)
    {
        (*Visit)(r->data);              //首先访问根节点
        PreOrder(r->leftChild, Visit);  //再遍历r的左子树
        PreOrder(r->rightChild, Visit); //最后遍历r的右子树
    }
}
template <class ElemType>
void BinarySortTree<ElemType>::PreOrder(void (*Visit)(const ElemType &)) const { PreOrder(root, Visit); }
template <class ElemType>
BinarySortTree<ElemType>::~BinarySortTree() { delete root; }
template <class ElemType>
BinarySortTree<ElemType>::BinarySortTree(const ElemType &e)
{
    root->data = e.data;
}
template <class ElemType>
BinarySortTree<ElemType>::BinarySortTree()
{
    root = NULL;
}
template <class ElemType>
void BinarySortTree<ElemType>::PostOrder(BinTreeNode<ElemType> *r, void (*Visit)(const ElemType &)) const
{
    if (r != NULL)
    {
        PostOrder(r->leftChild, Visit);  //首先遍历r的左子树
        PostOrder(r->rightChild, Visit); //再遍历r的右子树
        (*Visit)(r->data);               //  最后访问根结点r
    }
}
template <class ElemType>
void BinarySortTree<ElemType>::PostOrder(void (*Visit)(const ElemType &)) const { PostOrder(root, Visit); }

template <class ElemType>
void BinarySortTree<ElemType>::LevelOrder(void (*Visit)(const ElemType &)) const
{
    LinkQueue<BinTreeNode<ElemType> *> q;
    BinTreeNode<ElemType> *t;
    if (root != NULL)
        q.EnQueue(root);
    while (!q.IsEmpty())
    {
        q.DelQueue(t);
        (*Visit)(t->data);
        if (t->leftChild != NULL)
            q.EnQueue(t->leftChild);
        if (t->rightChild != NULL)
            q.EnQueue(t->rightChild);
    }
}

template <class ElemType>
void BinarySortTree<ElemType>::InOrder(BinTreeNode<ElemType> *r, void (*Visit)(const ElemType &)) const
{
    if (r != NULL)
    {
        InOrder(r->leftChild, Visit);  //首先遍历r的左子树
        (*Visit)(r->data);             //再访问根节点r
        InOrder(r->rightChild, Visit); //最后遍历r的右子树
    }
}
template <class ElemType>
void BinarySortTree<ElemType>::InOrder(void (*Visit)(const ElemType &)) const
{
    InOrder(root, Visit);
}

template <class ElemType>
void BinarySortTree<ElemType>::CreateBinaryTree()
{
    CreateBtr(root);
}

void CreateBtr(BinTreeNode<char> *&r)
{
    char ch;
    cin >> ch;
    if (ch == '#')
        r = NULL;
    else
    {
        r = new BinTreeNode<char>(ch); //先序序列,就先给根创建
        CreateBtr(r->leftChild);       // r的左孩子看成根递地归创建
        CreateBtr(r->rightChild);      // r的右孩子看成根递归地创建
    }
}
#pragma once
template <class ElemType> 
struct BinTreeNode{ 
    ElemType data; // 数据域
    BinTreeNode<ElemType> *leftChild; // 左孩子指针域
    BinTreeNode<ElemType> *rightChild; // 右孩子指针域
    BinTreeNode(); // 无参数的构造函数
    BinTreeNode(const ElemType &d, BinTreeNode<ElemType> *lChild = NULL, BinTreeNode<ElemType> *rChild = NULL); 
    };
template <class ElemType>
BinTreeNode<ElemType>::BinTreeNode()
{
    leftChild = rightChild = NULL;
}

template <class ElemType>
BinTreeNode<ElemType>::BinTreeNode(const ElemType &d, BinTreeNode<ElemType> *lChild, BinTreeNode<ElemType> *rChild)
{
    data = d;
    leftChild = lChild;
    rightChild = rChild;
}
#pragma once
#include "Node.h"
template<class ElemType> class LinkQueue { 
protected: 
    Node<ElemType> *front, *rear; // 队头队尾指针
public: 
    LinkQueue(); 
    virtual ~LinkQueue(); 
    int GetLength() const; 
    bool IsEmpty() const; 
    void Clear(); 
    Status DelQueue(ElemType &e);  
    Status GetHead(ElemType &e) const; 
    Status EnQueue(const ElemType e); 
    void Traverse(void (*Visit)(const ElemType &)) const;
};

template<class ElemType> 
Status LinkQueue<ElemType>::DelQueue(ElemType &e){ 
    if (!IsEmpty()) { Node<ElemType> *p = front->next; 
    e = p->data; 
    front->next = p->next; 
    if (rear == p) rear = front;//队列中只有一个元素
    delete p; 
        return SUCCESS; } 
    else 
        return OVER_FLOW;
}

template<class ElemType> 
Status LinkQueue<ElemType>::EnQueue(const ElemType e) { 
    Node<ElemType> *p; 
    p = new Node<ElemType>(e); 
    if (p) { 
        rear->next = p; 
        rear = rear->next; 
        return SUCCESS; 
    } 
    else    
        return OVER_FLOW;        
}
template<class ElemType> 
Status LinkQueue<ElemType>::GetHead(ElemType &e) const { 
    if (!IsEmpty()) { 
        e = front->next->data;
        return SUCCESS; 
        } 
        else 
        return OVER_FLOW; 
}
template<class ElemType> 
void LinkQueue<ElemType>::Clear() { 
    Node<ElemType> *p = front->next; 
    while (p != NULL) { 
        front->next = p->next; 
        delete p;        
        p = front->next; 
        } 
        rear = front; 
}
template<class ElemType> LinkQueue<ElemType>::~LinkQueue() {        
    Clear();     
    delete front;         
}
//判断链式队列是否为空
template<class ElemType> 
bool LinkQueue<ElemType>::IsEmpty() const {        
    return rear == front;        
    }
template<class ElemType> LinkQueue<ElemType>::LinkQueue() 
{
    rear = front = new Node<ElemType>();
}
#pragma once
template<class ElemType>
struct Node{
        ElemType data;
        Node<ElemType>* next;
        Node();
        Node(ElemType e,Node<ElemType>* link = NULL);
};
template<class ElemType>
Node<ElemType>::Node()
{
    next = NULL;
    data = 0;
}
template<class ElemType>
Node<ElemType>::Node(ElemType e,Node<ElemType> *link)
{
    data = e;
    next = link;
}
#pragma once
typedef enum{NOT_PRESENT,ENTRY_FOUND,RANGE_ERROR,SUCCESS,OVER_FLOW} Status ;



版权声明:本文为sofanfanfan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。