C++实现常见数据结构

来源:互联网 发布:base64编码数据库类型 编辑:程序博客网 时间:2024/06/04 18:43

 

 算法(C++实现)    
/**////////////////////////////
//    //
//   堆栈数据结构   stack.h         //
//    //
/**////////////////////////////


#include<iostream.h>

template<class Type>class Stack;

template<class Type>
class StackNode
...{
    friend class Stack<Type>;
private:
    Type data;
    StackNode<Type> *link;
    StackNode(Type D=0,StackNode<Type> *L=NULL):link(L),data(D)......{}
};

template<class Type>
class Stack
...{
public:
    Stack():top(NULL),NumItem(0)......{}
    void Push(Type item);
    Type Pop();
    Type GetTop();
    void MakeEmpty();
    bool ISEmpty();
    int GetNum();
private:
    int NumItem;
    StackNode<Type> *top;
};

template<class Type>
void Stack<Type>::Push(Type item)
...{
    top=new StackNode<Type>(item,top);
    NumItem++;
}

template<class Type>
Type Stack<Type>::Pop()
...{
    StackNode<Type> *p;
    Type temp;
    temp=top->data;
    p=top;
    top=top->link;
    delete p;
    NumItem--;
    return temp;
}

template<class Type>
Type Stack<Type>::GetTop()
...{
    return top->data;
}

template<class Type>
bool Stack<Type>::ISEmpty()
...{
    return top==NULL;
}

template<class Type>
void Stack<Type>::MakeEmpty()
...{
    delete top;
}

template<class Type>
int Stack<Type>::GetNum()
...{
    return NumItem;
}

 

/**/////////////////////////////
//    //
//   队列数据结构       Queue.h //
//    //
/**/////////////////////////////
#include<iostream.h>

template<class Type> class Queue;

template<class Type> class QueueNode
...{
    friend class Queue<Type>;
private:
    Type data;
    QueueNode<Type> *link;
    QueueNode(Type d=0,QueueNode *l=NULL):data(d),link(l)......{}
};

template <class Type> class Queue
...{
public:
    Queue():rear(NULL),front(NULL)......{}
    ~Queue();
    void EnQueue(Type item);
    Type DelQueue();
    Type GetFront();
    void MakeEmpty();
    bool ISEmpty() ......{ return front==NULL; }
private:
    QueueNode<Type> *front,*rear;
};


template<class Type>
Queue<Type>::~Queue()
...{
    QueueNode<Type> *p;
    while(front!=NULL)
    ...{
        p=front;
        front=front->link;
        delete p;
    }
}

template<class Type>
void Queue<Type>::EnQueue(Type item)
...{
    if(front==NULL)
        front=rear=new QueueNode<Type> (item,NULL);
    else
        rear=rear->link=new QueueNode<Type> (item,NULL);
}


template<class Type>
Type Queue<Type>::DelQueue()
...{
    QueueNode<Type> *p=front;
    Type temp=p->data;;
    front=front->link;
    delete p;
    return temp;
}


template<class Type>
Type Queue<Type>::GetFront()
...{
    return front->data;
}


template<class Type>
void Queue<Type>::MakeEmpty()
...{
    QueueNode<Type> *p;
    while(front!=NULL)
    ......{
        p=front;
        front=front->link;
        delete p;
    }
}


/**/////////////////////////////
//    //
//   链表数据结构  list.h //
//    //
/**///////////////////////////


#include<iostream.h>

template<class type>
class list;

template<class type>
class listnode
...{
public:
    friend class list<type>;
private:
    type data;
    listnode<type> * next;
};


template<class type>
class list
...{
public:
    list();
    ~list();
    void insertend(type); //向链表尾部插入元素
    bool insert(type,int); //向链表任意位置插入元素
    void delnode(int i);  //删除元素
    int find(type T);   //查找元素
    void makeempty();   //销毁链表
    bool print();  //打印链表
    int getlen();  //得到链表长度
private:
    listnode<type> *first,*last;
    int length;
};

template<class type>
void initlist(type &tmp);

template<class type>
void list_exit(list<type> &L,type tmp);

void initation();

template<class type>
void list_insertend(list<type> &L,type tmp);


template<class type> int list<type>::getlen()
...{
    return length;
}

template<class type> void list<type>::makeempty()
...{
    listnode<type> *p1,*p2;

    p1=first->next;
    first->next=NULL;
    while(p1!=NULL)
    ...{
        p2=p1;
        p1=p1->next;
        delete p2;
    }
    length=0; 
}

template<class type> void list<type>::insertend(type t)
...{

    listnode<type> *p;
    p=new listnode<type>;
    p->data=t;
    p->next=NULL;
    last->next=p;
    last=p;

    length++;
}

template<class type> bool list<type>::insert(type t,int i)
...{
    listnode<type> *p;
    p=first;

    int k=1;
    while(p!=NULL&&k<i)
    ...{
        p=p->next;
        k++;
    }
    if(p==NULL&&k!=i)
        return false;
    else
    ...{
        listnode<type> *tp;
        tp=new listnode<type>;
        tp->data=t;
        tp->next=p->next;
        p->next=tp;
        length++;

        return true;
    }
}

template<class type> void list<type>::delnode(int i)
...{
    int k=1;
    listnode<type> *p,*t;
    p=first;

    while(p->next!=NULL&&k!=i)
    ...{
        p=p->next;
        k++;
    }
    t=p->next;
    cout<<"你已经将数据项 "<<t->data<<"删除"<<endl;

    p->next=p->next->next;
    length--;
    delete t;
}

template<class type> bool list<type>::print()
...{
    listnode<type> *p=first->next;
    if(length==0)
        return false;
    else
    ...{
        cout<<"链表中有"<<length<<"项数据: "<<endl;
        while(p)
        ...{
            cout<<p->data<<" ";
            p=p->next;
        }
    }
    cout<<endl;


    return true;
}

template<class type> int list<type>::find(type T)
...{
    listnode<type> *p=first->next;
    int i=1;
    while(p&&p->data!=T)
    ...{
        p=p->next;
        i++;
    }
    if(p)
        return i;
    else
        return 0;
}


template<class type> list<type>::~list()
...{
    delete first;
    cout<<"欢迎再次使用 (!^!) "<<endl;
}

template<class type> list<type>::list()
...{
    listnode<type> *node=new listnode<type>;
    node->next=NULL;
    first=last=node;
    length=0;
}

/**/////////////////////////////
//    //
//   图数据结构  graph.h  //
//    //
/**////////////////////////////


#include<iostream.h>
#include"Queue.h"

template<class NameType,class DisType>class Graph;

template<class NameType,class DisType> struct Node   
...{
    friend class Graph<NameType,DisType>;
    int num;
    DisType val;
    Node<NameType,DisType> *next;
};

template<class NameType,class DisType> struct GpNode
...{
    friend class Graph<NameType,DisType>;
    NameType data;
    Node<NameType,DisType> *link;
};

template<class NameType,class DisType>
class Graph
...{
public:
    void Creat();  //创建图
    void PrintNode();    //打印图中的各个数据项
    void DFS();    //图的深度优先搜索,主过程
    void DFS(int v,int visited[]); // 子过程
    void BFS();  //图的广度优先搜索,主过程
    void BFS(int v,int visited[]); //子过程
    void ShortPath();     //求最短路径
private:
    GpNode<NameType,DisType> *table;
    Node<NameType,DisType> *p;
    int NumNode;        //节点个数
};


template<class NameType,class DisType>
void Graph<NameType,DisType>::Creat()
...{
    do
    ...{
        cout<<"请输入节点个数:  ";
        cin >> NumNode;
    }while(NumNode<=0);

    table=new GpNode<NameType,DisType>[NumNode];
    cout<<"请输入各节点数据项"<<endl;
    for(int i=0;i<NumNode;i++)
    ...{
        cin>>table[i].data;
        table[i].link=NULL;
    }

    cout<<"请输入各边的关系 (如: A B)"<<endl;
    i=1;
    NameType nodeA,nodeB;
    bool findA,findB;
    char ISExit;
    int m,n;
    do
    ...{
        findA=findB=false;
        cout<<"请输入第"<<i<<"对边的关系"<<endl;
        cin>>nodeA>>nodeB;
        for(m=0,n=0;m<NumNode&&n<NumNode&&!(findA & findB);) //查找边的节点
        ...{
            if(nodeA!=table[m].data)
                m++;
            else
                findA=true;
            if(nodeB!=table[n].data)
                n++;
            else
                findB=true;

        }
        if(!(findA & findB))
            cout<<"输入的节点数据项有错误"<<endl;
        else
        ...{
            p=new Node<NameType,DisType>;
            p->next=table[m].link;
            p->num=n;
            table[m].link=p;
            cout<<"请输入该对边的权值: ";
            cin>>p->val;
            i++;
        }
        cout<<"是否继续输入: y)继续,X)任意键退出 ";
        cin>>ISExit;
        if(ISExit!='y'&&ISExit!='Y')
            break;

    }while(true);

}

template<class NameType,class DisType>
void Graph<NameType,DisType>::PrintNode()
...{
    cout<<"图中各节点数据项 : ";
    for(int i=0;i<NumNode;i++)
        cout<<table[i].data<<" ";
    cout<<endl;
}


template<class NameType,class DisType>
void Graph<NameType,DisType>::DFS()
...{
    int *visited=new int[NumNode];
    cout<<"图的深度优先搜索 : ";
    for(int i=0;i<NumNode;i++)
        visited[i]=0;
    for(i=1;i<NumNode;i++) //遍厉孤立节点
        DFS(i,visited);
    delete []visited;
    cout<<endl;
}

template<class NameType,class DisType>
void Graph<NameType,DisType>::DFS(int v,int visited[])
...{
    Node<NameType,DisType> *t;
    if(visited[v]==0)
        cout<<table[v].data<<" ";
    visited[v]=1;
    t=table[v].link;
    while(t!=NULL)
    ...{
        if(visited[t->num]==0)
            DFS(t->num,visited);
        t=t->next;
    }
}


template<class NameType,class DisType>
void Graph<NameType,DisType>::BFS()
...{
    int *visited=new int[NumNode];
    cout<<"图的广度优先搜索 : ";
    for(int i=0;i<NumNode;i++)
        visited[i]=0;
    for( i=0;i<NumNode;i++)
        BFS(i,visited);
}


template<class NameType,class DisType>
void Graph<NameType,DisType>::BFS(int v,int visited[])
...{
    Queue<int> q;
    int n;
    if(visited[v]==0)
    ...{
        visited[v]=1;
        cout<<table[v].data<<" ";
        q.EnQueue(v);
        while(!q.ISEmpty())
        ...{
            n=q.DelQueue();
            p=table[n].link;
            while(p!=NULL)
            ...{
                n=p->num;
                if(visited[n]==0)
                ...{
                    cout<<table[n].data<<" ";
                    visited[n]=1;

                }
                p=p->next;
            }

        }
    }

}


/**/////////////////////////////
//    //
//  排序算法数据结构 Compositor.h     //
//    //
/**////////////////////////////


#include<iostream.h>


template<class Type>
class Compositor
...{
public:
    Compositor():sort(NULL)......{}
    void Creat();    //创建排序数组
    void Bubble(); //冒泡排序 
    void Insert(); //插入排序
    //快速排序
    void Quick(); 
    void QSort(int,int);
    int Partition(int low,int high);
    //归并排序
    void Merge(Type SR[],Type TR[],int i,int m,int n);
    void Msort(Type SR[],Type TR1[],int s,int t);
    void MergeSort();
    //选择排序
    void Select();
    void Print();   //打印排序后的结果
protected:
    Type *sort;
    int leng;
};

template<class Type>
void Compositor<Type>::Creat()
...{
    cout<<"输入你需要排序的数据个数: ";
    cin>>leng;
    while(leng<=0)
    ...{
        cout<<"输入数据有误";
        cin>>leng;
    }
    sort=new Type[leng];
    cout<<"请输入各数据项:";
    for(int i=0;i<leng;i++)
        cin>>sort[i];


template<class Type>
void Compositor<Type>::Insert()
...{
    Creat();
    Type temp;
    for(int i=1;i<leng;i++)
    ...{
        if(sort[i]<sort[i-1])
        ...{
            temp=sort[i];
            for(int j=i-1;temp<sort[j]&&j>=0;j--)
            ...{
                sort[j+1]=sort[j];
            }
            sort[j+1]=temp;
        }
    }
    Print();

}

template<class Type>
void Compositor<Type>::Bubble()
...{
    Creat();
    Type temp;
    for(int i=leng-1;i>=0;i--)
    ...{
        for(int j=0;j<leng-1;j++)
        ...{
            if(sort[j]>sort[j+1])
            ...{
                temp=sort[j];
                sort[j]=sort[j+1];
                sort[j+1]=temp;
            }
        }
    }
    Print();
}

template<class Type>
void Compositor<Type>::Quick()
...{
    Creat();
    QSort(0,leng-1);
    Print();
}

template<class Type>
void Compositor<Type>::QSort(int s,int t)
...{
    if(s<t-1)
    ...{
        int pivotloc=Partition(s,t);
        QSort(s,pivotloc-1);
        QSort(pivotloc+1,t);
    }
}

template<class Type>
int Compositor<Type>::Partition(int low,int high)
...{
    Type pivotkey=sort[low];
    while(low < high)
    ...{
        while(low<high&&sort[high]>=pivotkey)
            --high;
        sort[low++]=sort[high];
        while(low<high&&sort[low]<=pivotkey)
            ++low;
        sort[high--]=sort[low];
    }  
    sort[low]=pivotkey;
    return low;
}

template<class Type>
void Compositor<Type>::MergeSort()
...{
    Creat();
    Msort(sort,sort,0,leng-1);
    Print();
}


template<class Type>
void Compositor<Type>::Msort(Type SR[],Type TR1[],int s,int t)
...{
    int m;
    Type *TR2=new Type[t-s];
    if(s==t) TR1[s]=SR[s];
    else
    ...{
        m=(t+s)/2;
        Msort(SR,TR2,s,m);
        Msort(SR,TR2,m+1,t);
        Merge(TR2,TR1,s,m,t);
    }
}

template<class Type>
void Compositor<Type>::Merge(Type SR[],Type TR[],int i,int m,int n)
...{
    for(int j=m+1,k=i;i<=m&&j<=n;k++)
    ...{
        if(SR[i]<=SR[j])
            TR[k]=SR[i++];
        else
            TR[k]=SR[j++];
    }
    while(i<=m)
        TR[k++]=SR[i++];
    while(j<=n)
        TR[k++]=SR[j++];
}


template<class Type>
void Compositor<Type>::Select()
...{
    Creat();
    Type temp;
    int t;
    for(int i=0;i<leng;i++)
    ...{
        t=i;
        for(int j=i+1;j<leng;j++)
        ...{
            if(sort[t]>sort[j])
                t=j;
        }
        if(t!=i)
        ...{
            temp=sort[t];
            sort[t]=sort[i];
            sort[i]=temp;
        }
    }
    Print();
}

template<class Type>
void Compositor<Type>::Print()
...{
    cout<<"排序结果为: ";
    for(int i=0;i<leng;i++)
        cout<<sort[i]<<" ";
    cout<<endl;
}

 

/**/////////////////////////////
//    //
//   二叉树数据结构  BinTree.h       //
//    //
/**////////////////////////////


#include<iostream.h>

template<class Type>class BinTree;

template<class Type>
class TreeNode
...{
protected:
    friend class BinTree<Type>;
    TreeNode():lchild(NULL),rchild(NULL)......{}
    Type data;
    TreeNode *lchild;  //左,右子树
    TreeNode *rchild;
};

template<class Type>
class BinTree
...{
    friend void BinTree_PRE(BinTree<Type>& BinTreeOPP);  //友元函数
    friend void BinTree_INO(BinTree<Type>& BinTreeOPP);
    friend void BinTree_POS(BinTree<Type>& BinTreeOPP);
    friend void BinTree_Destroy(BinTree<Type>& BinTreeOPP);
public:
    BinTree():root(NULL)......{}
    void CreatTree();               //创建二叉树,主过程
    void CreatTree(TreeNode<Type>* child,int k); //子过程
    void PreTree(TreeNode<Type> *point);     //先序遍历二叉树
    void InoTree(TreeNode<Type> *point);  //中序遍历二叉树
    void PosTree(TreeNode<Type> *point);  //后序遍历二叉树
    void Destroy(TreeNode<Type> *point);     //销毁二叉树
    bool ISEmpty();
protected:
    TreeNode<Type>* root;
};


template<class Type>
void BinTree<Type>::CreatTree()
...{
    CreatTree(root,1);
}

template<class Type>
void BinTree<Type>::CreatTree(TreeNode<Type>* child,int k)
...{
    TreeNode<Type>* point;
    point=new TreeNode<Type>;
    cout<<"输入节点数据项 :";
    cin>>point->data;
    switch(k)
    ...{
    case 1: root=point; break;
    case 2: child->lchild=point;break;
    case 3: child->rchild=point;break;
    }

    char temp;
    cout<<"该"<<point->data<<"节点是否有左子树 Y / 任意键 :";
    cin>>temp;
    if(temp=='y'||temp=='Y')
    ...{
        CreatTree(point,2);
    }

    cout<<"该"<<point->data<<"节点是否有右子树 Y / 任意键 :";
    cin>>temp;
    if(temp=='y'||temp=='Y')
    ...{
        CreatTree(point,3);
    }
}

template<class Type>
void BinTree<Type>::PreTree(TreeNode<Type> *point)
...{
    if(point!=NULL)
    ...{
        cout<<" "<<point->data;
        PreTree(point->lchild);
        PreTree(point->rchild);
    }
}


template<class Type>
void BinTree<Type>::InoTree(TreeNode<Type> *point)
...{
    if(point!=NULL)
    ...{

        InoTree(point->lchild);
        cout<<" "<<point->data;
        InoTree(point->rchild);
    }
}

template<class Type>
void BinTree<Type>::PosTree(TreeNode<Type> *point)
...{
    if(point!=NULL)
    ...{

        PosTree(point->lchild);
        PosTree(point->rchild);
        cout<<" "<<point->data;
    }
}


template<class Type>
bool BinTree<Type>::ISEmpty()
...{
    return root==NULL;
}

template<class Type>
void BinTree<Type>::Destroy(TreeNode<Type> *point)
...{
    if(point!=NULL)
    ...{
        Destroy(point->lchild);
        Destroy(point->rchild);
        delete point;
    }
}


/**////////////////////////////
//    //
//  基本功能函数 BaseFun.h   //
//    //
/**////////////////////////////

void GRAPH();
void LIST();
void STACK();
void QUEUE();
void COMPOSITOR();
void BINTREE();

/**//////////////////////////////
//    //
//   堆栈功能函数   Stack.cpp/ /
//    //
/**/////////////////////////////

 

#include"Stack.h"
#include"iostream.h"


const int INT =13;
const double FLOAT= 13.33;
const char CHAR ='a';

 


template<class Type>
void Stack_Push(Stack<Type> &StackOPP)
...{
    cout<<"请输入要插入的数据项: ";
    Type item;
    cin>>item;
    StackOPP.Push(item);
}

template<class Type>
void Stack_Pop(Stack<Type> &StackOPP)
...{
    if(!StackOPP.ISEmpty())
    ...{
        cout<<"出栈数据项: ";
        cout<<StackOPP.Pop()<<endl;
    }
    else
    ...{
        cout<<"堆栈已经为空!"<<endl;
    }
}

template<class Type>
void Stack_ISEmpty(Stack<Type> &StackOPP)
...{
    if(!StackOPP.ISEmpty())
        cout<<"堆栈不空,还有"<<StackOPP.GetNum()<<"数据项!"<<endl;
    else
        cout<<"堆栈为空!"<<endl;

}

template<class Type>
void Stack_GetTop(Stack<Type> &StackOPP)
...{
    if(!StackOPP.ISEmpty())
        cout<<"栈顶元素为:"<<StackOPP.GetTop()<<endl;
    else
        cout<<"堆栈为空!"<<endl;
}

template<class Type>
void Stack_MakeEmpty(Stack<Type> &StackOPP)
...{
    if(!StackOPP.ISEmpty())
    ...{
        StackOPP.MakeEmpty();
        cout<<"堆栈已经销毁!"<<endl;
    }
    else
    ...{
        cout<<"销毁失败!"<<endl;
    }
}


template<class Type>
void StackINI(Type temp)
...{
    Stack<Type> StackOPP;

    do
    ...{
        cout<<"堆栈的操作: "<<endl
            <<" 1) 插入堆栈"<<endl
            <<" 2) 出栈"<<endl
            <<" 3) 堆栈是否为空"<<endl
            <<" 4) 得栈顶数据项"<<endl
            <<" 5) 销毁堆栈"<<endl
            <<" X) 退出堆栈操作"<<endl;
        int item;
        cin>>item;
        switch(item)
        ...{
        case 1: Stack_Push(StackOPP); break;
        case 2: Stack_Pop(StackOPP);  break;
        case 3: Stack_ISEmpty(StackOPP);  break;
        case 4: Stack_GetTop(StackOPP); break;
        case 5: Stack_MakeEmpty(StackOPP); break;

        default: return ;
        }

    }while(true);


}


void STACK()
...{
    int item;
    cout<<"清选择数据类型: 1) 整型 2) 浮点型 3) 字符型 X) 退出: ";

    cin>>item;
    switch(item)
    ...{
    case 1: StackINI(INT); break; //根据不同的用户需要选择数据类型
    case 2: StackINI(FLOAT); break;
    case 3: StackINI(CHAR); break;
    default: return ; break;
    }
}

 

/**//////////////////////////////
//    //
//   队列功能函数 Queue.h  //
//    //
/**/////////////////////////////

 

#include"Queue.h"

const int INT =13;
const double FLOAT= 13.33;
const char CHAR ='a';

 

template<class Type>
void Queue_Enter(Queue<Type> &QueueOPP)
...{
    cout<<"请输入要插入队列的数据: ";
    Type item;
    cin>>item;
    QueueOPP.EnQueue(item);
}

template<class Type>
void Queue_Del(Queue<Type> &QueueOPP)
...{
    if(!QueueOPP.ISEmpty())
    ...{
        cout<<"出队数据:"<<QueueOPP.DelQueue()<<endl;
    }
    else
    ...{
        cout<<"队列已为空!"<<endl;
    }
}

template<class Type>
void Queue_ISEmpty(Queue<Type> &QueueOPP)
...{
    if(QueueOPP.ISEmpty())
    ...{
        cout<<"队列已空!"<<endl;
    }
    else
    ...{
        cout<<"队列不空!"<<endl;
    }
}


template<class Type>
void Queue_GetFront(Queue<Type> &QueueOPP)
...{
    if(!QueueOPP.ISEmpty())
    ...{
        cout<<"队头元素为: "<<QueueOPP.GetFront()<<endl;
    }
    else
    ...{
        cout<<"队列已空!"<<endl;
    }
}

template<class Type>
void Queue_MakeEmpty(Queue<Type> &QueueOPP)
...{
    QueueOPP.MakeEmpty();
    cout<<"队列清空!"<<endl;
}

template<class Type>
void QueueINI(Type temp)
...{
    Queue<Type> QueueOPP;

    do
    ...{
        cout<<"队列的操作: "<<endl
            <<" 1) 插入队列"<<endl
            <<" 2) 出队"<<endl
            <<" 3) 队列是否为空"<<endl
            <<" 4) 得队头数据项"<<endl
            <<" 5) 销毁队列"<<endl
            <<" X) 退出队列操作"<<endl;
        int item;
        cin>>item;
        switch(item)
        ...{
        case 1: Queue_Enter(QueueOPP); break;
        case 2: Queue_Del(QueueOPP); break;
        case 3: Queue_ISEmpty(QueueOPP);  break;
        case 4: Queue_GetFront(QueueOPP); break;
        case 5: Queue_MakeEmpty(QueueOPP); break;

        default: return ;
        }

    }while(true);


}


void QUEUE()  //根据不同的用户需要选择数据类型
...{
    int item;
    cout<<"清选择数据类型: 1) 整型 2) 浮点型 3) 字符型 X) 退出: ";


    cin>>item;
    switch(item)
    ...{
    case 1: QueueINI(INT); break; 
    case 2: QueueINI(FLOAT); break;
    case 3: QueueINI(CHAR); break;
    default: return ; break;
    }
}


/**//////////////////////////////
//    //
//   链表     List.h           //
//    //
/**/////////////////////////////


#include"list.h"
#include<iostream.h>
#include<stdlib.h>


template<class type>
void initlist(type &tmp)
...{
    list<type> List;
    int n;

    while(true)
    ...{

        cout<<"请选择你要对链表进行的操作 "<<endl
            <<"1) 在末尾插入数据"<<endl
            <<"2) 在任意处插入数据"<<endl
            <<"3) 删除数据项"<<endl
            <<"4) 删除整个链表"<<endl
            <<"5) 打印链表"<<endl
            <<"6) 查找数据项"<<endl
            <<"7) 退出"<<endl;

        cout<<"> ";
        cin>>n;

        while(n<1||n>7)
        ...{
            cout<<"输入有误,请从新输入!"<<endl;
            cout<<"> ";
            cin>>n;
        }

        switch(n)
        ...{
        case 1: list_insertend(List);break;
        case 2: list_insert(List);break;
        case 3: list_delnode(List);break;
        case 4: list_makeempty(List);break;
        case 5: list_print(List);break;
        case 6: list_find(List);break;
        case 7: return ;break;
        }

    }

}

void LIST()
...{
    int n;
    cout<<"请选择你要构造的链表的数据类型 1)整型,2)字符型,3)浮点型"<<endl; 
    cout<<"> ";
    cin>>n;

    while(n<1||n>3)
    ...{
        cout<<"输入有误,请从新输入!"<<endl;
        cout<<"> ";
        cin>>n;
    }

    char t_c='c';
    int t_i=12;
    double t_f=23.3;

    switch(n)
    ...{
    case 1:initlist(t_i);break;
    case 2:initlist(t_c);break;
    case 3:initlist(t_f);break;
    }
}

template<class type>
void list_insertend(list<type> &L)
...{
    type t;
    cout<<"请输入插入数据: >";
    cin>>t;
    L.insertend(t);
}

template<class type>
void list_find(list<type> &L)
...{
    type T;
    cout<<"请输入你要查找的数据项:> ";
    cin>>T;

    int i;
    if(!(i=L.find(T)))
        cout<<"你要查找的数据项不存在!"<<endl;
    else
        cout<<"你要查找的数据项在第"<<i<<"个位置"<<endl;
}

template<class type>
void list_insert(list<type> &L)
...{

    type t;
    cout<<"请输入插入数据: >";
    cin>>t;

    int n;
    cout<<"请输入插入位置: >";
    cin>>n;
    if(L.insert(t,n))
        cout<<"插入成功! 在"<<n<<"位置 插入"<<t<<endl;
    else
        cout<<"插入失败! 插入位置不正确!"<<endl;

}

template<class type>
void list_delnode(list<type>& L)
...{
    int i;
    cout<<"请输入要删除数据项的位置: >";
    cin>>i;


    while(i<1||i>L.getlen())
    ...{
        cout<<"输入有误,可能大与链表长度,请从新输入!"<<endl;
        cout<<"> ";
        cin>>i;
    }

    L.delnode(i);
}
template<class type>
void list_makeempty(list<type> &L)
...{
    L.makeempty();
}

template<class type>
void list_print(list<type> &L)
...{
    if(!L.print())
        cout<<"链表为空!"<<endl;
}


/**//////////////////////////////
//    //
//   图功能函数  Graph.h    //
//    //
/**/////////////////////////////


#include"Graph.h"

template<class NameType,class DisType>
void Graph_Creat(Graph<NameType,DisType> &GraphOPP)
...{
    GraphOPP.Creat();
}

template<class NameType,class DisType>
void Graph_DFS(Graph<NameType,DisType> &GraphOPP)
...{
    GraphOPP.DFS();
}

template<class NameType,class DisType>
void Graph_BFS(Graph<NameType,DisType> &GraphOPP)
...{
    GraphOPP.BFS();
}

template<class NameType,class DisType>
void Graph_PRINT(Graph<NameType,DisType> &GraphOPP)
...{
    GraphOPP.PrintNode();
}


void GRAPH()
...{
    Graph<char,int> GraphOPP;
    do
    ...{
        cout<<"图的操作: "<<endl
            <<" 1) 建立图"<<endl
            <<" 2) 图的深度优先搜索"<<endl
            <<" 3) 图的广度优先搜索"<<endl
            <<" 4) 打印图中各结点"<<endl
            <<" X) 退出排序操作"<<endl;
        int item;
        cin>>item;
        switch(item)
        ...{
        case 1: Graph_Creat(GraphOPP); break;
        case 2: Graph_DFS(GraphOPP);  break;
        case 3: Graph_BFS(GraphOPP);  break;
        case 4: Graph_PRINT(GraphOPP);  break;
        default: return ;
        }

    }while(true);


}

/**//////////////////////////////
//    //
//  排序算法功能函数    Compositor.cpp //
//    //
/**/////////////////////////////

 

#include"Compositor.h"


const int INT =13;
const double FLOAT= 13.33;
const char CHAR ='a';

template<class type>
void CompositorINI(type temp)
...{
    Compositor<type> CompositorOPP;

    do
    ...{
        cout<<"排序的操作: "<<endl
            <<" 1) 插入排序"<<endl
            <<" 2) 快速排序"<<endl
            <<" 3) 归并排序"<<endl
            <<" 4) 冒泡排序"<<endl
            <<" 5) 选择排序"<<endl
            <<" X) 退出排序操作"<<endl
            <<"请选择相应的操作: ";
        int item;
        cin>>item;
        switch(item)
        ...{
        case 1: Compositor_Insert(CompositorOPP); break;
        case 2: Compositor_Quick(CompositorOPP);  break;
        case 3: Compositor_Merge(CompositorOPP);  break;
        case 4: Compositor_Bubble(CompositorOPP); break;
        case 5: Compositor_Select(CompositorOPP); break;

        default: return ;
        }

    }while(true);


}

void COMPOSITOR()//根据不同的用户需要选择数据类型
...{
    int item;
    cout<<"清选择数据类型: 1) 整型 2) 浮点型 3) 字符型 X) 退出: ";


    cin>>item;
    switch(item)
    ...{
    case 1: CompositorINI(INT); break; 
    case 2: CompositorINI(FLOAT); break;
    case 3: CompositorINI(CHAR); break;
    default: return ; break;
    }
}

template<class type>
void Compositor_Insert(Compositor<type> CompositorOPP)
...{
    CompositorOPP.Insert();
}

template<class type>
void Compositor_Quick(Compositor<type> CompositorOPP)
...{
    CompositorOPP.Quick();
}

template<class type>
void Compositor_Select(Compositor<type> CompositorOPP)
...{
    CompositorOPP.Select();
}

template<class type>
void Compositor_Merge(Compositor<type> CompositorOPP)
...{
    CompositorOPP.MergeSort();
}


template<class type>
void Compositor_Bubble(Compositor<type> CompositorOPP)
...{
    CompositorOPP.Bubble();
}

/**//////////////////////////////
//    //
//   二叉树功能函数 BinTree.cpp//
//    //
/**/////////////////////////////


#include<iostream.h>
#include"BinTree.h"

const int INT =13;
const double FLOAT= 13.33;
const char CHAR ='a';

 

template<class Type>
void BinTree_CREAT(BinTree<Type>& BinTreeOPP)
...{
    BinTreeOPP. CreatTree();
}

template<class Type>
void BinTree_PRE(BinTree<Type>& BinTreeOPP)
...{
    if(!BinTreeOPP.ISEmpty())
    ...{
        cout<<"先序遍历二叉树 : ";
        BinTreeOPP. PreTree(BinTreeOPP.root);
    }
    else
    ...{
        cout<<"二叉树已经为空!"<<endl;
    }
}

template<class Type>
void BinTree_INO(BinTree<Type>& BinTreeOPP)
...{
    if(!BinTreeOPP.ISEmpty())
    ...{
        cout<<"中序遍历二叉树 : ";
        BinTreeOPP. InoTree(BinTreeOPP.root);
    }
    else
    ...{
        cout<<"二叉树已经为空!"<<endl;
    }

}

template<class Type>
void BinTree_POS(BinTree<Type>& BinTreeOPP)
...{
    if(!BinTreeOPP.ISEmpty())
    ...{
        cout<<"后序遍历二叉树 : ";
        BinTreeOPP. PosTree(BinTreeOPP.root);
    }
    else
    ...{
        cout<<"二叉树已经为空!"<<endl;
    }
}

template<class Type>
void BinTree_Destroy(BinTree<Type>& BinTreeOPP)
...{
    BinTreeOPP.Destroy(BinTreeOPP.root);
    BinTreeOPP.root=NULL;
    cout<<"二叉树已经销毁!"<<endl;
}

template<class Type>
void BinTree_THREAD(BinTree<Type>& BinTreeOPP)
...{
    if(BinTreeOPP.ISThread())
    ...{
        cout<<"该二叉树已经线索化!!"<<endl;
    }
    else
    ...{
        BinTreeOPP.ThreadTree();
    }
}

template<class Type>
void BinTree_THROUGH(BinTree<Type>& BinTreeOPP)
...{
    BinTreeOPP.Through();
}


template<class Type>
void BinTreeINI(Type temp)
...{
    BinTree<Type> BinTreeOPP;

    do
    ...{
        cout<<"树的操作: "<<endl
            <<" 1) 构造二叉数"<<endl
            <<" 2) 先序遍历二叉树"<<endl
            <<" 3) 中序遍历二叉树"<<endl
            <<" 4) 后序遍历二叉树"<<endl
            <<" 5) 销毁二叉树  "<<endl
            <<" X) 退出二叉树操作"<<endl;
        int item;
        cin>>item;
        switch(item)
        ...{
        case 1: BinTree_CREAT(BinTreeOPP); break; //构造二叉数
        case 2: BinTree_PRE(BinTreeOPP);  break; //先序遍历二叉树
        case 3: BinTree_INO(BinTreeOPP); break;  //中序遍历二叉树
        case 4: BinTree_POS(BinTreeOPP); break;   //后序遍历二叉树
        case 5: BinTree_Destroy(BinTreeOPP);break;   //求树的深度
        default: return ;
        }

    }while(true);


}

void BINTREE()
...{
    int item;
    cout<<"清选择数据类型: 1) 整型 2) 浮点型 3) 字符型 X) 退出: ";


    cin>>item;
    switch(item)
    ...{
    case 1: BinTreeINI(INT); break; //根据不同的用户需要选择数据类型
    case 2: BinTreeINI(FLOAT); break;
    case 3: BinTreeINI(CHAR); break;
    default: return ; break;
    }
}


/**//////////////////////////////
//    //
//   主函数 index.cpp  用户菜单 //
//    //
/**/////////////////////////////

#include <iostream.h>
#include"BaseFun.h"

void main()
...{
    //功能菜单
    do
    ...{
        cout<<"欢迎使用数据结构算法集"<<endl
            <<"1) 线性表 "<<endl
            <<"2) 堆栈 "<<endl
            <<"3) 队列 "<<endl
            <<"4) 二叉树 "<<endl
            <<"5) 图 "<<endl
            <<"6) 排序算法 "<<endl
            <<"7) 字符串 "<<endl
            <<"X) 按任意键退出 "<<endl;
        cout<<" 请您选择何种数据结构的操作:"<<endl;
        int kind;
        cin>>kind;
        switch(kind)
        ...{
        case 1: LIST(); break;
        case 2: STACK(); break;
        case 3: QUEUE(); break;
        case 4: BINTREE(); break;
        case 5: GRAPH(); break;
        case 6: COMPOSITOR(); break;
        default: return;
        }
    }while(true);
}