#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);
}