图数据结构 graph.h

类别:编程语言 点击:0 评论: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.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;
  }

}
}

}

本文地址:http://com.8s8s.com/it/it26312.htm