`
jaychang
  • 浏览: 716625 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类
最新评论

临界表标示图非递归DFS

 
阅读更多
#include<iostream>

using namespace std;

#define MAX_VERTEX_NUM 50               //定义最大的结点数

typedef enum{DG,UDG}GraphKind;         //定义图的种类DG(有向图) UDG(无向图)

typedef char VertexData;                         //定义结点信息的数据类型

//定义弧结点
typedef struct EdgeNode
{ 
 int adjvex;   //该弧指向顶点的位置
 //VertexData data;
 EdgeNode *next;
}EdgeNode;

//定义表头结点
typedef struct VetexNode
{
 VertexData data;
 EdgeNode *link;
}VetexNode;

//定义基于邻接表的图
typedef struct AdjList
{
 int vexNun,arcNun; //定义邻接表的顶点数,弧数
 VetexNode vertex[MAX_VERTEX_NUM];
 GraphKind kind;
}AdjList;

//定义访问标志数组(标识该顶点是否被访问过)
int visited[MAX_VERTEX_NUM]={0};

// 创建图,输入信息包括(图的定点数,边数,图的种类,及每条边的起始,结束位置)
void CreateGraph(AdjList *adj,int *n)
{ 
 int e,s,d;
 char str;
 cout<<"输入顶点数(n)和边数(e)\n";
 cin>>*n>>e;
 adj->arcNun=*n;
 adj->vexNun=e;
 cout<<"选择图的类型有向图(D)无向图(U)\n";
 cin>>str;

 //判断图的类型
 switch(str)
 {
  case 'D': adj->kind=DG;
   break;
  case 'U': adj->kind=UDG;
   break;
  default :
   cout<<"没有此类型的图\n";
   break;
 }
 EdgeNode *q=NULL;

 //初始化n个表头结点
 for(int i=1;i<=*n;i++)
 {
  cout<<"输入第"<<i<<"个结点的信息\n";
  cin>>adj->vertex[i].data;
  adj->vertex[i].link=NULL;
 }
 for(i=1;i<=e;i++)
 {
  cout<<"请输入边的起始与目的位置\n";
  cin>>s>>d;
  q=(EdgeNode *)malloc(sizeof(EdgeNode));
  if(q==NULL) return;
  q->adjvex=d;
  q->next=adj->vertex[s].link;
  adj->vertex[s].link=q;
 } 
}



void visit(AdjList *adjlist,int v0)
{
	cout<<adjlist->vertex[v0].data<<endl;
}

//深度遍历图
void DepthFirstAdjList(AdjList *adjlist,int v0)
{
	visit(adjlist,v0);visited[v0]=1;	
	EdgeNode *q=adjlist->vertex[v0].link;
	while(q!=NULL)
	{	
		if(!visited[q->adjvex])
		{
			DepthFirstAdjList(adjlist,q->adjvex);
		}
		q=q->next;
	}
}

int main()
{
 int n;
 AdjList * adj=(AdjList *)malloc(sizeof(AdjList));
 CreateGraph(adj,&n);
 DepthFirstAdjList(adj,1);
 return 0;
}

 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics