|
|
图数据结构 graph.h |
|
|
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站 |
/////////////////////////// // // // 图数据结构 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.data; table.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.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=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=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; }
} }
}

|
|
相关文章:相关软件: |
|