zoukankan      html  css  js  c++  java
  • QueueNode.h

    template<typename Type> class LinkQueue;
    
    template<typename Type> class QueueNode{
    private:
    	friend class LinkQueue<Type>;
    	QueueNode(const Type item,QueueNode<Type> *next=NULL)
    		:m_data(item),m_pnext(next){}
    private:
    	Type m_data;
    	QueueNode<Type> *m_pnext;
    };
    

    LinkQueue.h

    #include "QueueNode.h"
    
    template<typename Type> class LinkQueue{
    public:
    	LinkQueue():m_prear(NULL),m_pfront(NULL){}
    	~LinkQueue(){
    		MakeEmpty();
    	}
    	void Append(const Type item);
    	Type Delete();
    	Type GetFront();
    	void MakeEmpty();
    	bool IsEmpty() const{
    		return m_pfront==NULL;
    	}
    	void Print();
    
    private:
    	QueueNode<Type> *m_prear,*m_pfront;
    };
    
    template<typename Type> void LinkQueue<Type>::MakeEmpty(){
    	QueueNode<Type> *pdel;
    	while(m_pfront){
    		pdel=m_pfront;
    		m_pfront=m_pfront->m_pnext;
    		delete pdel;
    	}
    }
    
    template<typename Type> void LinkQueue<Type>::Append(const Type item){
    	if(m_pfront==NULL){
    		m_pfront=m_prear=new QueueNode<Type>(item);
    	}
    	else{
    		m_prear=m_prear->m_pnext=new QueueNode<Type>(item);
    	}
    }
    
    template<typename Type> Type LinkQueue<Type>::Delete(){
    	if(IsEmpty()){
    		cout<<"There is no element!"<<endl;
    		exit(1);
    	}
    	QueueNode<Type> *pdel=m_pfront;
    	Type temp=m_pfront->m_data;
    	m_pfront=m_pfront->m_pnext;
    	delete pdel;
    	return temp;
    }
    
    template<typename Type> Type LinkQueue<Type>::GetFront(){
    	if(IsEmpty()){
    		cout<<"There is no element!"<<endl;
    		exit(1);
    	}
    	return m_pfront->m_data;
    }
    
    template<typename Type> void LinkQueue<Type>::Print(){
    	QueueNode<Type> *pmove=m_pfront;
    	cout<<"front";
    	while(pmove){
    		cout<<"--->"<<pmove->m_data;
    		pmove=pmove->m_pnext;
    	}
    	cout<<"--->rear"<<endl<<endl<<endl;
    }
    

    TreeNode.h

    template<typename Type> class Tree;
    
    template<typename Type> class TreeNode{
    public:
    	friend class Tree<Type>;
    
    private:
    	Type m_data;
    	TreeNode<Type> *m_pfirst,*m_pnext;
    	TreeNode():m_pfirst(NULL), m_pnext(NULL){}
    	TreeNode(Type item, TreeNode<Type> *first = NULL, TreeNode<Type> *next = NULL)
    		:m_data(item), m_pfirst(first), m_pnext(next){}
    };
    

    Tree.h

    #include "TreeNode.h"
    #include "LinkQueue.h"
    
    template<typename Type> class Tree{
    public:
        Tree():m_proot(NULL), m_pcurrent(NULL){}
    public:
        TreeNode<Type> *GetCurrent(){	//Get the current node
            return m_pcurrent;
        }
        void SetCurrent(TreeNode<Type> *current){	//set the current node
            m_pcurrent = current;
        }
        bool Insert(Type item);		//insert an new node to current node
        void Remove(Type item);		//delete the node whose data is equal to item
        void Remove(TreeNode<Type> *current);	//delete the node
        bool Find(Type item);		//find the node whose data is equal to item
        void PrintChild(TreeNode<Type> *current);	//print the child tree
        TreeNode<Type> *Parent(TreeNode<Type> *current);	//get the parent
    
        void Print();				//print the tree
        void PreOrder(TreeNode<Type> *root);	//ordering the tree by visiting the root first
        void PostOrder(TreeNode<Type> *root);	//ordering the tree by visiting the root last
        void LevelOrder(TreeNode<Type> *root);	//ordering the tree by level
        void PreOrder();
        void PostOrder();
        void LevelOrder();
    
    private:
       TreeNode<Type> *m_proot,*m_pcurrent;	
        bool Find(TreeNode<Type> *root, Type item);
        void Remove(TreeNode<Type> *root, Type item);
        TreeNode<Type> *Parent(TreeNode<Type> *root, TreeNode<Type> *current);
        void Print(TreeNode<Type> *start, int n=0);
    };
    
    template<typename Type> bool Tree<Type>::Insert(Type item){
        TreeNode<Type> *newnode = new TreeNode<Type>(item);
        if (NULL == newnode){
            cout << "Application Error!" <<endl;
            exit(1);
        }
        if (NULL == m_proot){
            m_proot = newnode;
            m_pcurrent = m_proot;
            return 1;
        }
        if (NULL == m_pcurrent){
            cerr << "insert error!" <<endl;
            return 0;
        }
    
        if(NULL == m_pcurrent->m_pfirst){
            m_pcurrent->m_pfirst = newnode;
            m_pcurrent = newnode;
            return 1;
        }
        TreeNode<Type> *pmove = m_pcurrent->m_pfirst;
        while(pmove->m_pnext){
            pmove = pmove->m_pnext;
        }
        pmove->m_pnext = newnode;
        m_pcurrent = newnode;
        return 1;
    
    }
    
    template<typename Type> void Tree<Type>::Remove(TreeNode<Type> *current){
        if(NULL == current){
            return;
        }
        TreeNode<Type> *temp = Parent(current);
        if(NULL == temp){
            TreeNode<Type> *pmove = current->m_pfirst;
            if(NULL != pmove->m_pfirst){
                pmove=pmove->m_pfirst;
                while(pmove->m_pnext){
                    pmove = pmove->m_pnext;
                }
                pmove->m_pnext = current->m_pfirst->m_pnext;
                current->m_pfirst->m_pnext = NULL;
            }
            else{
                pmove->m_pfirst = pmove->m_pnext;
            }
            m_proot = current->m_pfirst;
        }
        else{
            if(temp->m_pfirst == current){
                TreeNode<Type> *pmove = current->m_pfirst;
                if (pmove){
                    while (pmove->m_pnext){
                        pmove = pmove->m_pnext;
                    }
                    pmove->m_pnext = current->m_pnext;
                }
                else{
                    current->m_pfirst = current->m_pnext;
                }
    
            }
            else{
                TreeNode<Type> *pmove = temp->m_pfirst;
                while(pmove->m_pnext != current){
                    pmove = pmove->m_pnext;
                }
                pmove->m_pnext = current->m_pnext;
                while(pmove->m_pnext){
                    pmove = pmove->m_pnext;
                }
                pmove->m_pnext = current->m_pfirst;
            }
        }
        delete current;
    }
    
    template<typename Type> void Tree<Type>::Remove(TreeNode<Type> *root, Type item){
        if(NULL == root){
            return;
        }
        if(root->m_pfirst){
            TreeNode<Type> *pmove=root->m_pfirst;
            while(pmove){
                Remove(pmove, item);
                pmove = pmove->m_pnext;
            }
        }	
        if(root->m_data == item){
            Remove(root);
        }
    
    }
    template<typename Type> void Tree<Type>::Remove(Type item){
        return Remove(m_proot, item);
    }
    
    template<typename Type> TreeNode<Type>* Tree<Type>::Parent(
        TreeNode<Type> *root, TreeNode<Type> *current){
            if(NULL == root){
                return NULL;
            }
            TreeNode<Type> *pmove=root->m_pfirst,*temp;
            if(NULL != pmove){
                while(pmove){
                    if(pmove == current){
                        return root;
                    }
                    pmove = pmove->m_pnext;
                }
            }
            pmove = root->m_pfirst;
            while(pmove){
                temp = Parent(pmove, current);
                if(temp){
                    return temp;
                }
                pmove = pmove->m_pnext;
            }
            return NULL;
    }
    
    template<typename Type> TreeNode<Type>* Tree<Type>::Parent(TreeNode<Type> *current){
        return Parent(m_proot,current);
    }
    
    template<typename Type> void Tree<Type>::PrintChild(TreeNode<Type> *current){
        TreeNode<Type> *pmove = current->m_pfirst;
        cout<<"first";
        if(NULL != pmove){
            cout<<"--->"<<pmove->m_data;
        }
        while(pmove->m_pnext){
            cout<<"--->"<<pmove->m_data;
            pmove = pmove->m_pnext;
        }
    }
    
    template<typename Type> bool Tree<Type>::Find(TreeNode<Type> *root, Type item){
        if (root->m_data == item){
            return 1;
        }
        if (NULL == root){
            return 0;
        }
        TreeNode<Type> *pmove=root->m_pfirst;
        if (NULL == pmove){
            return 0;
        }
        while (pmove){
            if (Find(pmove, item)){
                return 1;
            }
            pmove = pmove->m_pnext;
        }
        return 0;
    }
    
    template<typename Type> bool Tree<Type>::Find(Type item){
        return Find(m_proot,item);
    }
    
    template<typename Type> void Tree<Type>::Print(TreeNode<Type> *start, int n = 0){
        if (NULL == start){
            for (int i=0; i<n; i++){
                cout << "     ";
            }
            cout << "NULL" << endl;
            return;
        }
        TreeNode<Type> *pmove = start->m_pfirst;
        Print(pmove, n+1);
    
        for (int i=0; i<n; i++){
            cout << "     ";
        }
        cout << start->m_data << "--->" <<endl;
    
        if (NULL == pmove){   
            return;
        }
        pmove = pmove->m_pnext;
        while (pmove){
            Print(pmove, n+1);
            pmove = pmove->m_pnext;
        }
    }
    
    template<typename Type> void Tree<Type>::Print(){
        Print(m_proot);
    }
    
    template<typename Type> void Tree<Type>::PreOrder(TreeNode<Type> *root){
        if (NULL == root){
            return;
        }
        cout << root->m_data;
        TreeNode<Type> *pmove = root->m_pfirst;
        while (pmove){
            PreOrder(pmove);
            pmove = pmove->m_pnext;
        }
    }
    
    template<typename Type> void Tree<Type>::PostOrder(TreeNode<Type> *root){
        if (NULL == root){
            return;
        }
        TreeNode<Type> *pmove = root->m_pfirst;
        while (pmove){
            PostOrder(pmove);
            pmove = pmove->m_pnext;
        }
        cout << root->m_data;
    }
    
    template<typename Type> void Tree<Type>::PreOrder(){
        PreOrder(m_proot);
    }
    
    template<typename Type> void Tree<Type>::PostOrder(){
        PostOrder(m_proot);
    }
    
    template<typename Type> void Tree<Type>::LevelOrder(TreeNode<Type> *root){	//using queue
        LinkQueue<TreeNode<Type> *> queue;
        TreeNode<Type> *pmove, *ptemp;
        if (root != NULL){
            queue.Append(root);
            while (!queue.IsEmpty()){
                ptemp = queue.Delete();
                cout << ptemp->m_data;
                pmove = ptemp->m_pfirst;
                while(pmove){
                    queue.Append(pmove);
                    pmove = pmove->m_pnext;
                }
            }
        }
    }
    
    template<typename Type> void Tree<Type>::LevelOrder(){
        LevelOrder(m_proot);
    }
    

    test.cpp
    #include <iostream>
    
    using namespace std;
    
    #include "Tree.h"
    
    int main(){
    	Tree<int> tree;
        int init[10]={3,6,0,2,8,4,9,1,5,7};
        for (int i=0; i<10; i++){
    	    tree.Insert(init[i]);
            if (1 == i % 2){
                tree.SetCurrent(tree.Parent(tree.GetCurrent()));
            }
        }
        tree.Print();
        cout << endl <<endl << endl;
        
        tree.Remove(3);
        tree.Print();
        cout << endl <<endl << endl;
    
        cout << tree.Find(5) << endl << tree.Find(11) <<endl;
        
        tree.PreOrder();
        cout << endl;
        tree.PostOrder();
        cout << endl;
        tree.LevelOrder();
    	return 0;
    }
    
  • 相关阅读:
    Think in java 4th读书笔记__last update20151130
    Angular学习笔记--last_update 20151106
    程序员技术练级攻略(转载)
    缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题(转载)
    简单理解 RPC(转载)
    Redis 为什么使用单进程单线程方式也这么快(转载)
    redis详解(三)-- 面试题(转载)
    redis应用-sortedset实现排行榜(转载)
    LRU原理和Redis实现——一个今日头条的面试题(转载)
    全面理解Java内存模型(JMM)及volatile关键字(转载)
  • 原文地址:https://www.cnblogs.com/rollenholt/p/2438235.html
Copyright © 2011-2022 走看看