图的遍历 帮我看下错在哪里啊

 

#include "stdio.h"
#include "malloc.h"   //堆的头文件
#define maxVertices  30         //图中定点数目的最大值
#define maxWeight  65535;  //用65535代表无穷大
//--------------图的类型和操作的定义------------------------
typedef char DataType_graph; 

typedef float Weight;  //带权图中边上权值的数据类型
typedef struct {
//邻接矩阵结构定义
 int numVertices,numEdges; //图中实际顶点个数和边数
 DataType_graph  *verticeList;  //顶点表
 Weight   **Edge;    //二维数组存放边
}Graph;
void  (*visit)(Graph g,int v);  //定义个函数指针
//邻接表表示的结构定义
typedef  struct Enode{
 int  dest;     //边的另一顶点位置
 Weight  cost;    //边上的权值
 struct Enode *link;         //下一条边链指针
}Edge;

typedef  struct Vnode{
 DataType_graph  data;  //顶点的数据
 struct Enode *adj;   //边链表的头指针
}Vertex;
typedef  struct{
 Vertex  *verticesList;  //顶点表
 int numVertices,numEdges;  
}Graph_link;

//操作定义如下
void  InitGraph(Graph *g,int v,int e){
//初始化该数据类型,提供要初始化的顶点数
//和边
 int i;int j;
 g->numVertices=v;
 g->numEdges=e;
 g->verticeList=(DataType_graph*)
  malloc(v*sizeof(DataType_graph));
 g->Edge=(Weight **)malloc(v*sizeof(Weight *));
 for(i=0;i<v;i++){
  g->Edge[i]=(Weight*)malloc(v*sizeof(Weight));}
 for(i=0;i<v;i++)          
  for(j=0;j<v;j++){
   if(i==j)g->Edge[i][j]=0;
   else
    g->Edge[i][j]=maxWeight;}
}
void  creat_Wxdgraph(Graph *g){
//邻接矩阵的创建方法
 int i,j,v,e; float  w;
 DataType_graph data;
 printf("请输入图的顶点个数和边的条数:\n");
 scanf("%d%d",&v,&e);
 InitGraph(g,v,e);
 for(i=0;i<v;i++){
  printf("\n请输入图的所有顶点Vi=");
  scanf("%c",&data);
  g->verticeList[i]=data;}  
 for(i=0;i<v;i++){        //输入图的边及权值
  printf("\n输入图中各边的起点终点及权的值i,j,w:\n");
  scanf("%d%d%f",&i,&j,&w);
  g->Edge[i][j]=w;}
}

int  getFristNeighbor(Graph g,int v){
//给出顶点V的第一个邻接顶点,如果找不到,则返回-1
 int col=0;
 if(v!=-1){
  for(col=0;col<g.numVertices;col++)
      if(g.Edge[v][col]>0 && g.Edge[v][col]<maxWeight)
    return col;
 }
 return -1;
}
int  getNexNeighbor(Graph g,int v,int w){
//给出顶点的V的某邻接顶点w的下一个邻接点
 int col;
 if(v!=-1&&w!=-1){
  for(col=w+1;col<g.numVertices;col++)
  // if((g.Edge[v][col])>0&&(g.Edge[v][col]<maxWeight))
    return  col;}
 return  -1;
}
void  printVertice(Graph g,int v){
//打印图顶点
 printf("%c",g.verticeList[v]);
}
void  DFS(Graph g,int v,int visited[]
    ,void  (*visit)(g,v)){
//从顶点位置V出发,以深度优先的次序访问所有可以读入
//的尚未访问过的顶点,算法中用到一个辅助数组visited,
//对已访问过的顶点作访问标志
 int w;
 visited[v]=1;    //顶点V作访问标志
 w=getFristNeighbor(g,v);
 while(w!=1){
  if(!visited[w]){
   DFS(g,w,visited,visit);}
  w=getNexNeighbor(g,v,w);
 }
}
void  main(){
 Graph g;
 int a[8]={0,0,0,0,0,0,0,0};
 creat_Wxdgraph(&g);
 DFS(g,0,a,printVertice);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值