資料結構 圖的鄰接表表示轉換成鄰接矩陣表示的演算法
阿新 • • 發佈:2019-01-01
圖的鄰接表表示轉換成鄰接矩陣表示的演算法。
下面這個是有向圖鄰接表表示轉換成鄰接矩陣
無向圖鄰接表表示轉換成鄰接矩陣#include <stdio.h> #include <string.h> #include <stdlib.h> int a[100][100];//鄰接矩陣的載體 typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc; }ArcNode; //表結點 typedef struct VNode{ char data; ArcNode *firstarc; }VNode,AdjList[20];//頭結點 typedef struct{ AdjList vertices; int vexnum,arcnum; }ALGraph;//鄰接表 int LocateVex(ALGraph G,char e) { int i; for(i=0;i<G.vexnum;i++) { if(G.vertices[i].data==e) return i;//找到後 返回i } return -1; } void CreatAdList(ALGraph &G) {//根據輸入的有向圖G的頂點數及邊數,建立圖G的鄰接表 int i,j,k; char v1,v2; ArcNode *s,*p; scanf("%d%d",&G.vexnum,&G.arcnum); getchar(); for(i=0;i<G.vexnum;i++) //初始化頭結點 { scanf("%c",&G.vertices[i].data); getchar(); G.vertices[i].firstarc=NULL; } for(i=0;i<G.vexnum;i++)//輸出一遍這些頭 { printf("%c ",G.vertices[i].data); } printf("\n"); for(k=0;k<G.arcnum;k++) {//輸入邊 scanf("%c %c",&v1,&v2); getchar(); i=LocateVex(G,v1); j=LocateVex(G,v2); s= (ArcNode *)malloc(sizeof(ArcNode)); s->adjvex=j; s->nextarc=NULL; p=G.vertices[i].firstarc; if(!p) { G.vertices[i].firstarc = s; } else { while(p->nextarc) p=p->nextarc; p->nextarc=s; } } }//CreateAdiMatrix void trans(ALGraph G) {//轉換函式 int i,j; ArcNode *p; for(i=0;i<=G.vexnum;i++)//先初始化,全部賦值為0 for(j=0;j<=G.vexnum;j++) { a[i][j]=0; } for(i=0;i<G.vexnum;i++) { p=G.vertices[i].firstarc; while(p) { a[i][p->adjvex]=1; p=p->nextarc; } } } void Output(ALGraph &G) { int i,j; for(i=0;i<G.vexnum;i++) { for(j=0;j<G.vexnum;j++) { printf("%d ",a[i][j]); } printf("\n"); } } int main() { ALGraph G; printf("有向圖處理篇\n"); CreatAdList(G); trans(G); Output(G); return 0; }
個人感覺無向圖和有向圖差別其實跟小,就是把下面這串程式碼複製一下,i,j換一下值就好了#include <stdio.h> #include <string.h> #include <stdlib.h> int a[100][100];//鄰接矩陣的載體 typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc; }ArcNode; //表結點 typedef struct VNode{ char data; ArcNode *firstarc; }VNode,AdjList[20];//頭結點 typedef struct{ AdjList vertices; int vexnum,arcnum; }ALGraph;//鄰接表 int LocateVex(ALGraph G,char e) { int i; for(i=0;i<G.vexnum;i++) { if(G.vertices[i].data==e) return i;//找到後 返回i } return -1; } void CreatAdList(ALGraph &G) {//根據輸入的有向圖G的頂點數及邊數,建立圖G的鄰接表 int i,j,k,tmp; char v1,v2; ArcNode *s,*p; scanf("%d%d",&G.vexnum,&G.arcnum); getchar(); for(i=0;i<G.vexnum;i++) //初始化頭結點 { scanf("%c",&G.vertices[i].data); getchar(); G.vertices[i].firstarc=NULL; } for(i=0;i<G.vexnum;i++)//輸出一遍這些頭 { printf("%c ",G.vertices[i].data); } printf("\n"); for(k=0;k<G.arcnum;k++) {//輸入邊 scanf("%c %c",&v1,&v2); getchar(); i=LocateVex(G,v1); j=LocateVex(G,v2); s= (ArcNode *)malloc(sizeof(ArcNode)); s->adjvex=j; s->nextarc=NULL; p=G.vertices[i].firstarc; if(!p) { G.vertices[i].firstarc = s; } else { while(p->nextarc) p=p->nextarc; p->nextarc=s; } tmp=i; i=j; j=tmp; s= (ArcNode *)malloc(sizeof(ArcNode)); s->adjvex=j; s->nextarc=NULL; p=G.vertices[i].firstarc; if(!p) { G.vertices[i].firstarc = s; } else { while(p->nextarc) p=p->nextarc; p->nextarc=s; } } }//CreateAdiMatrix void trans(ALGraph G) {//轉換函式 int i,j; ArcNode *p; for(i=0;i<=G.vexnum;i++)//先初始化,全部賦值為0 for(j=0;j<=G.vexnum;j++) { a[i][j]=0; } for(i=0;i<G.vexnum;i++) { p=G.vertices[i].firstarc; while(p) { a[i][p->adjvex]=1; p=p->nextarc; } } } void Output(ALGraph &G) { int i,j; for(i=0;i<G.vexnum;i++) { for(j=0;j<G.vexnum;j++) { printf("%d ",a[i][j]); } printf("\n"); } } int main() { ALGraph G; printf("有向圖處理篇\n"); CreatAdList(G); trans(G); Output(G); return 0; }
版權,僅供參考。。。。。i=LocateVex(G,v1); j=LocateVex(G,v2); s= (ArcNode *)malloc(sizeof(ArcNode)); s->adjvex=j; s->nextarc=NULL; p=G.vertices[i].firstarc; if(!p) { G.vertices[i].firstarc = s; } else { while(p->nextarc) p=p->nextarc; p->nextarc=s; }