DFS-邻接表

思考(当然参考到大神的啦)加写(中间看了会前端放松一下),差不多一天就过去了,其中毫无bug却运行不出最终的结果,debug不好搞啊!!最后附上结果还有一张图,还有用邻接矩阵输入写的,思想是理解了 ,实现好难啊!!

#include<stdio.h>
#include<stdlib.h>
#define max 100
typedef int tex;
typedef struct ArcNODE//定义边表结点 
{
    
    
	int adjvex;//该狐所指的顶点的位置 
	int weight;//边的权重
	struct ArcNODE *next;//指向下一条狐的指针 
}ArcNODE;
typedef  struct VNODE//定义顶点表结点 
{
    
    
	int date;//顶点信息 
     ArcNODE *first;//指向第一条依附于该顶点的狐的指针 
}VNODE,Adlist[max];

typedef struct Graph //定义图 
{
    
    
	int vnum,arcnum;//定义顶点和狐数的个数
	 Adlist vertices;
}Graph;
int visited[max];
void visit(Graph G,int v);
void create(Graph *G);
void out(Graph G);
void DFS(Graph G,int v);
void DFStravel(Graph G);
int first(Graph G,int v);
int next(Graph G,int v,int w);
int main()
{
    
    
    Graph G;
	create(&G);
	out(G);
	DFStravel(G); 
	return 0;
}
void create(Graph *G)
{
    
    
	int i,j;
	ArcNODE *arcNODE=NULL;
	tex oo,pp,kk;//oo代表狐的尾,pp代表头,kk代表权 
	printf("请输入顶点和边结点的个数:\n");
	scanf("%d %d",&G->vnum,&G->arcnum);
	for(i=0;i<G->vnum;i++)
	{
    
    
		printf("请输入第%d顶点的的值 ",i+1);
		scanf("%d",&G->vertices[i].date);
		G->vertices[i].first=NULL;
		printf("\n");
	}
		printf("请依次输入狐的尾,头,权重,用逗号隔开\n");
	for(j=0;j<G->arcnum;j++)
	{
    
    
	
          	printf("第%d条边",j);
		scanf("%d,%d,%d",&oo,&pp,&kk);
		arcNODE=(ArcNODE *)malloc(sizeof(ArcNODE));
		arcNODE->adjvex=pp;
		arcNODE->next=G->vertices[oo].first;
		arcNODE->weight=kk;
		G->vertices[oo].first=arcNODE;
		//因为无向图是双向的
	    arcNODE=(ArcNODE *)malloc(sizeof(ArcNODE));//不可省啊!!!!!!! 
		arcNODE->adjvex=oo;
		arcNODE->next=G->vertices[pp].first;
			arcNODE->weight=kk;
		G->vertices[pp].first=arcNODE;
	}
 } 

 void out(Graph G)
 {
    
    
 
 	int i;
 	for(i=0;i<G.vnum;i++)
	 {
    
    
	 	ArcNODE *arcnode=G.vertices[i].first;
	 	printf("%d \t",G.vertices[i].date); 
	while(arcnode)
	  {
    
    
	  	printf("%d %d  ",arcnode->adjvex,arcnode->weight);
	  	arcnode=arcnode->next;
	  }
	  printf("\n"); 
     }
 }
 
 void DFStravel(Graph G)
 {
    
    
 	int v;
 	for(v=0;v<G.vnum;v++)
 	visited[v]=0;//标记顶点 
 	printf("\n该图的深度优先顺序如下:\n");
	 for(v=0;v<G.vnum;v++)
	 {
    
    
	 	if(visited[v]==0)//标记顶点 跟104行做对应 
	 	DFS(G,v);
	  } 
 }
 void DFS(Graph G,int v)
 {
    
    
 	visit(G,v);//输出遍历的顶点 
	visited[v]=1;//对遍历过的顶点进行赋值为1;
	//进行递归 
	for(int w=first(G,v);w>=0;w=next(G,v,w))
	{
    
    
		if(!visited[w])
		DFS(G,w);//用递归 
	 } 
 }
void visit(Graph G,int v)
{
    
    
	printf("%d ",G.vertices[v].date ); 
}
int first(Graph G,int v)//V第一个邻接点对应的位置序号 
{
    
    
	
	
	if(G.vertices[v].first==NULL)
     return -1;

     return G.vertices[v].first->adjvex;
}
int next(Graph G,int v,int w)// 除了V以外第一个邻接点对应的位置序号 
{
    
    
	ArcNODE *p=G.vertices[v].first;
	while(p!=NULL&&p->adjvex!=w)
	{
    
    
		p=p->next;
	}
	if(p==NULL||p->next==NULL)
	return -1;

	return p->next->adjvex; 
}

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46809332/article/details/105313224
今日推荐