基于邻接表的深度优先搜索

//本文将讨论数据结构中的图搜索方法
#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值