tu.h文件 #include<stdio.h> #define Max_Vertex_Num 100 //定义最大顶点数 typedef struct ArcCell { int adj;//表示该弧的权值 int * info;//弧的相关信息 } ArcCell,AdjMatrix[Max_Vertex_Num][Max_Vertex_Num];//弧的信息 typedef struct { int vexs[Max_Vertex_Num];//顶点集合数组 AdjMatrix arcs; //每条弧的对应信息 int n,e; //顶点个数和弧的条数 }MGraph;//一张图的信息 typedef struct { int adjvex; int lowcost; }closedge[Max_Vertex_Num];//辅助数组定义 tu.c文件 #include<stdio.h> #include"tu.h" //建立邻接矩阵 void CreatMGraph(MGraph *G) { int i,j,k,m; printf("请分别输入图的顶点个数和边的条数:/n"); scanf("%d%d",&G->n,&G->e); //输入顶点数和边数 printf("请输入顶点信息:"); for(i=0;i<G->n;i++) scanf("%d",&G->vexs[i]); //读入顶点信息,建立顶点表 for(i=0;i<G->n;i++) for(j=0;j<G->n;j++) { G->arcs[i][j].adj=0; G->arcs[i][j].info=NULL; } //初始化邻接矩阵 printf("请输入边所依附的顶点的序号并输入该边的权值构建无向图的邻接矩阵/n"); for(k=0;k<G->e;k++) { //读入e条边,建立邻接矩阵 scanf("%d%d%d",&i,&j,&m); //输入边所依附的顶点的序号 G->arcs[i][j].adj=m; G->arcs[j][i].adj=m; } } /*普利姆算法构造最小生成树*/ void minispantree(MGraph * g,int u) { closedge c; int i,j,m; for(j=0;j<g->n;j++) {//辅助数组初始化 if(j!=u) { c[j].adjvex=g->vexs[u]; c[j].lowcost=g->arcs[u][j].adj; }//辅助数组初始化,U={u} } c[u].lowcost=0; for(i=1;i<g->n;i++)//选择其余G.vexnum-1个顶点 { //下列两个for循环求出T的下一个节点,第k个节点 for(m=0;m<g->n;m++) if(c[m].lowcost!=0)u=m; for(m=0;m<g->n;m++) if(c[m].lowcost!=0&&c[u].lowcost>c[m].lowcost)u=m; printf("%d %d/n",c[u].adjvex,g->vexs[u]); c[u].lowcost=0;//第k个顶点如U集合 for(j=0;j<g->n;j++) if(g->arcs[u][j].adj<c[j].lowcost) { //新顶点并入U后重新计算各边的最小值 c[j].adjvex=g->vexs[u]; c[j].lowcost=g->arcs[u][j].adj; } } } main.c文件 #include<stdio.h> #include"tu.c" //主函数 int main(void) { int i; MGraph * G; G=(MGraph *)malloc(sizeof(MGraph)); //为图G申请内存空间 CreatMGraph(G); //建立邻接矩阵 printf("从顶点序号为0开始由普里姆算法得最小生成树其形成过程为:分别表示为权 值和对应的顶点/n"); minispantree(G,0); return 0; } 实验结果的截图: