資料結構例程——圖的鄰接矩陣儲存結構及演算法
阿新 • • 發佈:2019-02-13
#include <stdio.h>
#include <malloc.h>
#define MAXV 100 /*最大頂點數設為100*/
#define LIMITLESS 9999
typedef struct
{
int no; //頂點編號
char info[20]; //頂點其他資訊,型別視應用而定
} VertexType; //頂點型別
typedef struct //圖的定義
{
int edges[MAXV][MAXV]; //鄰接矩陣
int n, e; //頂點數,弧數
VertexType vexs[MAXV];//存放頂點資訊
} MGraph;
//建立一個圖的鄰接矩陣儲存
void CreateMGraph(MGraph *G)
{
/*建立有向圖G 的鄰接矩陣儲存*/
int i,j,k,w;
printf("請輸入頂點數和邊數(輸入格式為:頂點數 邊數):");
scanf("%d %d",&(G->n),&(G->e)); /*輸入頂點數和邊數*/
printf("請輸入頂點資訊(輸入格式為:頂點號 頂點描述):\n");
for (i=0; i<G->n; i++)
scanf ("%d %s",&(G->vexs[i].no),G->vexs[i].info); /*輸入頂點資訊,建立頂點表*/
for (i=0; i<G->n; i++) /*初始化鄰接矩陣*/
for (j=0; j<G->n; j++)
{
if(i==j)
G->edges[i][j]=0;
else
G->edges[i][j]=LIMITLESS;
}
printf("請輸入每條邊對應的兩個頂點的序號及權值(輸入格式為:i j w):\n" );
for (k=0; k<G->e; k++)
{
scanf("%d %d %d",&i,&j,&w); /*輸入e 條邊,建立鄰接矩陣*/
G->edges[i][j]=w; /*若為無權圖,直接G->edges[j][i]=1;,無需輸入w*/
}
}/*CreateMGraph*/
//顯示一個用鄰接矩陣儲存的圖
void DispMGraph(MGraph *G)
{
int i,j;
printf("頂點數: %d,邊數: %d\n", G->n, G->e);
printf("%d 個頂點的資訊::\n", G->n);
for (i=0; i<G->n; i++) /*輸出頂點資訊*/
printf("%5d %5d %s\n", i, G->vexs[i].no, G->vexs[i].info);
printf("各頂點相連的情況:\n");
printf("\t");
for (j=0; j<G->n; j++)
printf("[%d]\t", j);
printf("\n");
for (i=0; i<G->n; i++)
{
printf("[%d]\t", i);
for (j=0; j<G->n; j++)
{
if(G->edges[i][j]==LIMITLESS)
printf("∞\t");
else
printf("%d\t", G->edges[i][j]);
}
printf("\n");
}
}/*DispMGraph*/
int main()
{
MGraph *g;
g = (MGraph *)malloc(sizeof(MGraph));
CreateMGraph(g);
DispMGraph(g);
return 0;
}