无向网邻接表的建立和输出(C语言) 实施效果图片如下:
c语言代码如下:
#include <stdio.h> #include <stdlib.h> #define maxvex 100 typedef int EdgeType; /* 边上的权值类型 */ typedef struct { EdgeType arc[maxvex][maxvex]; /* 邻接矩阵,看作边表 */ int numnodes, numedges; /* 图中当前的顶点数和边数 */ }MGraph; typedef struct EdgeNode /* 边表结点 */ { struct EdgeNode *next; /* 链域,指向下一个邻接点 */ }EdgeNode; typedef struct vertexnode /* 顶点表结点 */ { char data[20]; /* 顶点域,存储顶点信息 */ EdgeNode *firstedge;/* 边表头指针 */ }vertexnode, AdjList[maxvex]; typedef struct { AdjList adjList; EdgeType arc[maxvex][maxvex]; int numnodes, numedges; /* 图中当前顶点数和边数 */ }graphAdjList,*GraphAdjList; int CreateMGraph(MGraph *G,GraphAdjList *G1) /* 无向网图邻接矩阵表示 */ { *G1 = (GraphAdjList)malloc(sizeof(graphAdjList)); int i,j,w,k; printf("输入顶点数目:"); scanf("%d",&G->numnodes); printf("请输入图的边数目:"); scanf("%d",&G->numedges); /* 输入顶点数和边数 */ for(k=1;k<=G->numedges;k++) /* 建立邻接矩阵 */ { printf("请输入第%d条边连接(vi,vj)的第一个顶点下标i(i=1,2...):",k); scanf("%d",&i); printf("请输入第%d条边连接(vi,vj)的第二个顶点下标j(j=1,2...):",k); scanf("%d",&j); printf("请输入第%d条边的权值:",k); scanf("%d",&w); G->arc[i][j]=w; G->arc[j][i]=w; } for(i=1;i<=G->numnodes;i++) { printf("请输入第%d个的顶点信息:",i); scanf("%s",(*G1)->adjList[i].data); } } void printCreateMGraph(MGraph *G,GraphAdjList *G1) {int i,j; printf("顶点序号----------顶点信息------相领顶点(权值)-------\n"); for(i=1;i<=G->numnodes;i++) { printf("V%d %s",i,(*G1)->adjList[i].data); for(j=1;j<=G->numnodes;j++) {if(!(i==j)&&!(G->arc[i][j]==NULL)) printf("------->%s%d",(*G1)->adjList[j].data,G->arc[i][j]);} printf("\n"); } return 1; } void menushow() { printf(" ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\n"); printf(" ▄ 0:结束循环退出 ▄\n"); printf(" ▄ 1:创建无向网(用邻接表存储) ▄\n"); printf(" ▄ 2:[从1创建中进行]无向网的邻接表的输出 ▄\n"); printf(" ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\n"); } int menuchoose() { int num; printf(" 请输入(0-2):"); scanf("%d",&num); return num; } int main() { MGraph G; GraphAdjList G1; int running=1; menushow(); while(running) { switch(menuchoose()) { case 1: CreateMGraph(&G,&G1); break; case 2: printCreateMGraph(&G,&G1); break; } system("pause"); } return 0; }