【資料結構】鄰接矩陣及其實現
阿新 • • 發佈:2018-11-24
檔案操作比直接輸入方便很多
直接輸入:
//建立圖的鄰接矩陣儲存結構 #include <stdio.h> #include <string.h> #define M 20 #define FINITY 5000 typedef struct { char vexs[M]; int edge[M][M]; int n,e; }Mgraph; //c=0,表示建立無向圖 void creat(Mgraph *g,int c) { int i,j,k,w; printf("請輸入頂點數和邊數:"); scanf("%d%d",&g->n,&g->e); getchar(); printf("請依次輸入各個頂點的資訊:"); for(i=0;i<g->n;i++) scanf("%c",&g->vexs[i]); getchar(); for(i=0;i<g->n;i++) { for(j=0;j<g->n;j++) { if(i==j) g->edge[i][j]=0; else g->edge[i][j]=FINITY; } } printf("請輸入兩個頂點的編號以及權值:\n"); for(k=0;k<g->e;k++) { scanf("%d%d%d",&i,&j,&w); g->edge[i][j]=w; if(c==0) g->edge[j][i]=w; } } void print(Mgraph *g) { int i,j; printf("一共有%d個邊,%d個點。\n",g->e,g->n); printf("各個元素資訊:\n"); for(i=0;i<g->n;i++) { printf("%c ",g->vexs[i]); } printf("\n"); printf("對應的鄰接矩陣:\n"); for(i=0;i<g->n;i++) { for(j=0;j<g->n;j++) { printf("%-5d",g->edge[i][j]); } printf("\n"); } } int main () { Mgraph g; printf("輸入:\n"); creat(&g,0); printf("\n"); printf("輸出:\n"); print(&g); return 0; }
檔案讀取:
//建立圖的鄰接矩陣儲存結構 #include <stdio.h> #include <string.h> #define M 20 #define FINITY 5000 typedef struct { char vexs[M]; int edge[M][M]; int n,e; }Mgraph; //c=0,表示建立無向圖 void creat(Mgraph *g,int c) { int i,j,k,w; FILE *f; f=fopen("test.txt","r"); if(f) { fscanf(f,"%d%d",&g->n,&g->e); for(i=0;i<g->n;i++) fscanf(f,"%s",&g->vexs[i]); for(i=0;i<g->n;i++) { for(j=0;j<g->n;j++) { if(i==j) g->edge[i][j]=0; else g->edge[i][j]=FINITY; } } for(k=0;k<g->e;k++) { fscanf(f,"%d%d%d",&i,&j,&w); g->edge[i][j]=w; if(c==0) g->edge[j][i]=w; } fclose(f); } else { g->n=0; } } void print(Mgraph *g) { int i,j; printf("一共有%d個邊,%d個點。\n",g->e,g->n); printf("各個元素資訊:\n"); for(i=0;i<g->n;i++) { printf("%c ",g->vexs[i]); } printf("\n"); printf("對應的鄰接矩陣:\n"); for(i=0;i<g->n;i++) { for(j=0;j<g->n;j++) { printf("%-5d",g->edge[i][j]); } printf("\n"); } } int main () { Mgraph g; creat(&g,0); printf("輸出:\n"); print(&g); return 0; }
用 法:int fscanf(FILE *stream, char *format,[argument...]);
int fscanf(檔案指標,格式字串,輸入列表);