#include <stdio.h> #include <malloc.h> #define LEN sizeof(struct MatrixGraph) #define TEN sizeof(struct MatrixGraph) #define VERTEX_MAX 26 #define MAXVALUE 32767 struct MatrixGraph { int Vertex[VERTEX_MAX]; //保存顶点信息(序号或字母) int Edges[VERTEX_MAX][VERTEX_MAX]; //保存边的权 int isTrav[VERTEX_MAX]; //遍历标志 int VertexNum; //顶点数量 int EdgeNum; //边数量 int GraphType; //图的类型 }; struct tree { int data; struct tree *lchild; struct tree *rchild; }; void CreateMatrixGraph(MatrixGraph *G) { int i,j,k,weight; int start,end; printf("输入各顶点信息\n"); for(i=0;i<G->VertexNum;i++) //输入顶点 { printf("\n第%d个顶点",i+1); scanf("%d",&G->Vertex[i]); } printf("输入构成各边的两个顶点及权值\n"); for(k=0;k<G->EdgeNum;k++) { printf("第%d条边:",k+1); scanf("%d,%d,%d",&start,&end,&weight); for(i=0;start!=G->Vertex[i];i++); //输入边的信息 for(j=0;end!=G->Vertex[j];j++); G->Edges[i][j]=weight; if(G->GraphType==0) //若是无向图 { G->Edges[j][i]=weight; //在对角位置保存权值 } } } void OutMatrix(MatrixGraph *G) { int i,j; for(j=0;j<G->VertexNum;j++) { printf("\t%d",G->Vertex[j]); //在第一行输出顶点信息 } printf("\n"); for(i=0;i<G->VertexNum;i++) { printf("%d",G->Vertex[i]); for(j=0;j<G->VertexNum;j++) { if(G->Edges[i][j]==MAXVALUE) //若权值为最大值 printf("\t#"); //输出#号 else printf("\t%d",G->Edges[i][j]); } printf("\n"); } } //先序遍历生成的森林 void BinTree_DLR(tree *bt) { if(bt) { printf("%d",bt -> data); if(bt -> lchild) { BinTree_DLR(bt -> lchild); } if(bt -> rchild) { BinTree_DLR(bt -> rchild); } } return; } //深度遍历 void DFSTree(MatrixGraph *G,tree *p, int j) { tree *t; G -> isTrav[j] = 1; for(int i = 0; i< G -> VertexNum; i++) { if(G -> Edges[j][i] != MAXVALUE&&!G -> isTrav[i]){ t = (struct tree*)malloc(TEN); t -> lchild = NULL; t -> rchild = NULL; t -> data = G -> Vertex[i]; p -> rchild = t; DFSTree(G,t,i); //递归进行遍历 } } } //生成森林 void DFSForest(MatrixGraph *G, tree *root) { int i; tree *q,*p; for(i = 0; i < G -> VertexNum; i++) G -> isTrav[i] = 0; for(i = 0; i < G -> VertexNum; i++){ if(G -> isTrav[i] == 0){ p = (struct tree*)malloc(TEN); p -> lchild = NULL; p -> rchild = NULL; p -> data = G -> Vertex[i]; if(root -> data == MAXVALUE){ root = p; } else q -> lchild = p; q = p; DFSTree(G,q,i); } } printf("中序遍历由图生成的树的结果:"); BinTree_DLR(root); printf("\n"); printf("帝国万岁!"); printf("\n"); } void main() { int i,j; MatrixGraph G; tree root; root.data = MAXVALUE; s: printf("无向图(选1)还是有向图(选2)?"); scanf("%d",&G.GraphType); if(G.GraphType != 1 && G.GraphType != 2){ printf("输入错误\n"); goto s; } printf("输入图的顶点数量和各边数量:"); scanf("%d,%d",&G.VertexNum,&G.EdgeNum); //输入图顶点数和边数 for(i=0;i<G.VertexNum;i++) for(j=0;j<G.VertexNum;j++) G.Edges[i][j]=MAXVALUE; CreateMatrixGraph(&G); printf("邻接矩阵数据如下:\n"); OutMatrix(&G); DFSForest(&G,&root); }