Пример #1
0
void DFS(Graph G, int v) {  // 算法7.5
   // 从第v个顶点出发递归地深度优先遍历图G。
   int w;
   visited[v] = true;   VisitFunc(v);  // 访问第v个顶点
   for (w=FirstAdjVex(G, v);  w!=-1;  w=NextAdjVex(G, v, w))
      if (!visited[w])   // 对v的尚未访问的邻接顶点w递归调用DFS
         DFS(G, w);
}
Пример #2
0
/*深度遍历*/
int visited[MAX_VERTEX_NUM]; /* 访问标志数组(全局量),未访问标记0,访问标记1 */
void(*VisitFunc)(char* v); /* 函数变量(全局量) */
void DFS(ALGraph G,int v)
{ /* 从第v个顶点出发递归地深度优先遍历图G。算法7.5 */
    int w;
    visited[v]=TRUE;/* 设置访问标志为TRUE(已访问) */
    VisitFunc(v);/* 访问第v个顶点 */
    for(int w=FirstAdjVex(G,G.vertices[v].data);w>0;w=NextAdjVex(G,G.vertices[v].data,G.vertices[w].data))
        if(!visited[w]) DFS(G,w);/* 对v的尚未访问的邻接点w递归调用DFS */
}
Пример #3
0
 void PostTraverse(SqBiTree T,int e)
 { // PostOrderTraverse()调用
   if(T[2*e+1]!=Nil) // 左子树不空
     PostTraverse(T,2*e+1);
   if(T[2*e+2]!=Nil) // 右子树不空
     PostTraverse(T,2*e+2);
   VisitFunc(T[e]);
 }
Пример #4
0
 void PreTraverse(SqBiTree T,int e)
 { // PreOrderTraverse()调用
   VisitFunc(T[e]);
   if(T[2*e+1]!=Nil) // 左子树不空
     PreTraverse(T,2*e+1);
   if(T[2*e+2]!=Nil) // 右子树不空
     PreTraverse(T,2*e+2);
 }
Пример #5
0
   /* 操作结果: 在G中删除弧<v,w> */
   int i,j;
   ArcBox *p1,*p2;
   i=LocateVex(*G,v); /* 弧尾的序号 */
   j=LocateVex(*G,w); /* 弧头的序号 */
   if(i<0||j<0||i==j)
     return ERROR;
   p2=(*G). xlist[i].firstout; /* 将弧结点从出弧链表中删去 */
   if(p2&&p2->headvex==j) /* 第1个结点为待删除结点 */
     (*G). xlist[i].firstout=p2->tlink;
   else
   {
     while(p2&&p2->headvex!=j) /* 向后找 */
     {
       p1=p2;
       p2=p2->tlink;
     }
     if(p2) /* 没到表尾 */
       p1->tlink=p2->tlink;
   }
   p2=(*G). xlist[j].firstin; /* 将弧结点从入弧链表中删去 */
   if(p2&&p2->tailvex==i)
     (*G). xlist[j].firstin=p2->hlink;
   else
   {
     while(p2&&p2->tailvex!=i)
     {
       p1=p2;
       p2=p2->hlink;
     }
     if(p2) /* 没到表尾 */
       p1->hlink=p2->hlink;
   }
   if(p2->info) /* 释放弧结点 */
     free(p2->info);
   free(p2);
   (*G). arcnum--; /* 弧数减1 */
   return OK;
 }

 Boolean visited[MAX_VERTEX_NUM]; /* 访问标志数组 */
 Status(*VisitFunc)(VertexType); /* 函数变量 */
 void DFS(OLGraph G,int i) /* DFSTraverse()调用 */
 {
   ArcBox *p;
   visited[i]=TRUE; /* 访问标志数组置1(已被访问) */
   VisitFunc(G.xlist[i].data); /* 遍历第i个顶点 */
   p=G.xlist[i].firstout; /* p指向第i个顶点的出度 */
   while(p&&visited[p->headvex]) /* p没到表尾且该弧的头顶点已被访问 */
     p=p->tlink; /* 查找下一个结点 */
   if(p&&!visited[p->headvex]) /* 该弧的头顶点未被访问 */
     DFS(G,p->headvex); /* 递归调用DFS() */
 }
Пример #6
0
void DFS(MGraph G, int v)
{/* 从第v个顶点出发递归地深度优先遍历图G。算法7.5 */
	VertexType w1, v1;
	int w;
	visited[v] = TRUE; /* 设置访问标志为TRUE(已访问) */
	VisitFunc(G.vexs[v]); //访问第v个顶点
	strcpy(v1, GetVex(G, v));
	for (w = FirstAdjVex(G, v1); w != -1; w = NextAdjVex(G, v1, strcpy(w1, GetVex(G, w))))
		if (!visited[w])
			DFS(G, w); //对v的尚未访问的序号为w的邻接顶点递归调用DFS
}
Пример #7
0
  /*           若w是v的最后一个邻接点,则返回-1 */
  ArcNode *p;
  int v1,w1;
  v1=LocateVex(G,v); /* v1为顶点v在图G中的序号 */
  w1=LocateVex(G,w); /* w1为顶点w在图G中的序号 */
  p=G.vertices[v1].firstarc;
  while(p&&p->adjvex!=w1) /* 指针p不空且所指表结点不是w */
    p=p->nextarc;
  if(!p||!p->nextarc) /* 没找到w或w是最后一个邻接点 */
    return -1;
  else /* p->adjvex==w */
    return p->nextarc->adjvex; /* 返回v的(相对于w的)下一个邻接顶点的序号 */
}
Boolean visited[MAX_VERTEX_NUM]; /* 访问标志数组(全局量) */
void(*VisitFunc)(char* v); /* 函数变量(全局量) */
void DFS(ALGraph G,int v)
{ /* 从第v个顶点出发递归地深度优先遍历图G。*/
  int w;
  VertexType v1,w1;
  strcpy(v1,*GetVex(G,v));
  visited[v]=TRUE; /* 设置访问标志为TRUE(已访问) */
  VisitFunc(G.vertices[v].data); /* 访问第v个顶点 */
  for(w=FirstAdjVex(G,v1);w>=0;w=NextAdjVex(G,v1,strcpy(w1,*GetVex(G,w))))
    if(!visited[w])
      DFS(G,w); /* 对v的尚未访问的邻接点w递归调用DFS */
}
Пример #8
0
Status DFS( AMLGraph G , int v )    //从第v个顶点出发递归地深度优先遍历图G
{
 int w ;

 visite[ v ] = TRUE ;
 VisitFunc( G.adjmulist[ v ].data ) ;  //访问第v个顶点
 for( w = FirstAdjVex( G , G.adjmulist[ v ].data ) ; w >= 0 ; w = NextAdjVex( G , G.adjmulist[ v ].data , G.adjmulist[ w ].data ) )
 {
  if( visite[ w ] != TRUE )
   DFS( G , w ) ;
 }
 return OK ;
}
Пример #9
0
void DFS(AMLGraph G,int v)
{
  int j;
  EBox *p;
  VisitFunc(G.adjmulist[v].data);
  visite[v]=TRUE;
  p=G.adjmulist[v].firstedge;
  while(p)
  {
    j=p->ivex==v?p->jvex:p->ivex;
    if(!visite[j])
      DFS(G,j);
    p=p->ivex==v?p->ilink:p->jlink;
  }
}
Пример #10
0
//Function use: 从第nSeqV个顶点出发深度遍历图
void DFS(MGraph G, int nSeqV)
{
	VertexType v;
	VertexType w;
	int nSeqW;
	visited[nSeqV] = TRUE;
	VisitFunc(G.vexs[nSeqV]);
	strcpy(v, *GetVex(G, nSeqV));
	for (nSeqW = FirstAdjVex(G, v);\
		nSeqW >= 0; nSeqW = NextAdjVex(G, v, w))
	{
		if (!visited[nSeqW])
		{
			DFS(G, nSeqW);
		}
	}
}
Пример #11
0
void DFS( AlGraph G, int v, bool visited[] ){
	visited[ v ] = true;
	VisitFunc( v );
}