这是我学数据结构编写的算法,我把他整理出来,都是基本算法,供大家学习。我使用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);
} |