//本文将讨论数据结构中的图搜索方法
#include<iostream>
#define maxvertex 10//定义最大顶点数。
using namespace std;
//建立有向图邻接表
typedef struct edgenode//表结点
{
int node;
edgenode *next;
}edgenode;
typedef struct vertex//定义头结点
{
int v;
edgenode *p;
}vertex;
typedef struct adjlist//定义邻接表
{
int vertexnum,edgenum;//有向图的顶点和边的数目。
vertex a[maxvertex];
}adjlist;
void CreatGraph(adjlist *adj,int *n)
{
int e,s,d;
cout<<"请输入图的顶点数和边的条数"<<endl;
cin>>*n>>e;
adj->vertexnum=*n;
adj->edgenum=e;
edgenode *q=NULL;
//初始化表头节点。
int i,j=1;
for (i=1;i<=*n;i++)
{
adj->a[i].v=j++;//将顶点的编号放入表头数组中,默认第一个顶点为1,第二个为2……
adj->a[i].p=NULL;
}
//对弧进行处理,一条边自然包括弧头和弧尾。
for(i=1;i<=e;i++)
{
cout<<"请输入第"<<i<<"条边的起点和终点"<<endl;
cin>>s>>d;//s表示起点,d表示终点。
//以下程序为表结点信息//
q=new(edgenode);//创建一个表结点。
if(NULL==q)
return;//创建表结点没有成功。
q->node=d;
q->next=adj->a[s].p;//新加入的节点都在头节点之后,原来在头结点之后的节点要后移。
adj->a[s].p=q;
}
}
void DispGraph(adjlist *adj)
{
int i,k=adj->vertexnum;//k为图的顶点数。
edgenode *q;
for(i=1;i<=k;i++)
{
q=adj->a[i].p;
if(NULL==q)
{
cout<<"没有从"<<i<<"指出的边"<<endl;
}
else
{
cout<<"从顶点"<<i<<"出发的边有:"<<endl;
while(NULL!=q)
{
cout<<i<<"→"<<q->node<<endl;
q=q->next;
}
}
}
}
void DFS(adjlist *adj,int i,int flag[]);
void Depth(adjlist *adj)
{
int i,k,*flag;
k=adj->vertexnum;//k为有向图的顶点的数目。
flag=new int[k];//申请标志数组空间。这里有一种对变长数组的处理。
for(i=0;i<k;i++)
flag[i]=0; //flag[i]为0,表示该节点没有被访问。
for(i=1;i<=k;i++)
{
if(0==flag[i-1])
DFS(adj,i,flag);
}
}
void DFS(adjlist *adj,int i,int flag[])
{
edgenode *ptr;
flag[i-1]=1;//将顶点i对应的标志位置1。
cout<<i<<" ";
for(ptr=adj->a[i].p;ptr!=NULL;ptr=ptr->next)//它也是循环。
{
int b=ptr->node;
if(flag[b-1]==0)
DFS(adj,b,flag);
}
}
void main()
{
//调用函数需要哪些参数。
int n;
adjlist *adj=new(adjlist);
CreatGraph(adj,&n);
DispGraph(adj);
Depth(adj);
}
转载于:https://my.oschina.net/u/1540091/blog/219934