//graph.h頭文件 typedef int InfoType; #define MAXV 100//最大頂點個數 //定義鄰接矩陣類型 typedef struct { int no;//頂點標號 InfoType info;//頂點其他信息,這里用於存放權值 }VertexType;//頂點類型 typedef struct//圖的定義 { int edges[MAXV][MAXV];//鄰接矩陣 int n,e;//頂點數,弧數 VertexType vexs[MAXV];//存放頂點信息 }MGraph;//圖的鄰接矩陣類型 //以下定義鄰接表類型 typedef struct ANode//弧的節點結構類型 { int adjvex;//該弧的終點位置 struct ANode*nextarc;//指向下一條弧的指針 InfoType info;//該弧的相關信息,這里用於存放權值 }ArcNode; typedef int Vertex; typedef struct Vnode//鄰接表節點的類型 { Vertex data;//頂點信息 ArcNode * firstarc;//指向第一條弧 }VNode; typedef VNode AdjList[MAXV];//AdjList 是鄰接表類型 typedef struct { AdjList adjlist;//鄰接表 int n,e;//圖的頂點數n和邊數e }ALGraph;//圖的鄰接表類型 //相關操作源文件.cpp #include<iostream> #include<stdio.h> #include<malloc.h> #include"graph.h" #define INF 32767//INF表示∞ void MatToList(MGraph g,ALGraph * &G) //將鄰接矩陣g轉換成鄰接表G { int i,j,n=g.n;//n為頂點數 ArcNode *p; G=(ALGraph *)malloc(sizeof(ALGraph)); for(i=0;i<n;i++)//給鄰接表中所有頭結點的指針域置初值 G->adjlist[i].firstarc=NULL; for(i=0;i<n;i++)//檢查鄰接矩陣中每個元素 for(j=n-1;j>=0;j--) if(g.edges[i][j]!=0)//鄰接矩陣的當前元素不為0 { p=(ArcNode *)malloc(sizeof(ArcNode));//創建一個結點*p p->adjvex=j; p->info=g.edges[i][j];//存放的權值 p->nextarc=G->adjlist[i].firstarc;//將*p鏈接到鏈表后 G->adjlist[i].firstarc=p; } G->n=n; G->e=g.e; } void ListToMat(ALGraph *G,MGraph &g) //將鄰接表G轉換成鄰接矩陣g { int i,j,n=G->n; ArcNode *p; for(i=0;i<n;i++) for(j=0;j<n;j++)//g.edges[i][j]賦初值0 g.edges[i][j]=0; for(i=0;i<n;i++) { p=G->adjlist[i].firstarc; while(p!=NULL)//對所有相鄰的頂點進行處理 { g.edges[i][p->adjvex]=p->info; p=p->nextarc; } } g.n=n; g.e=G->e; } void DispMat(MGraph g) //輸出鄰接矩陣g { int i,j; for(i=0;i<g.n;i++) { for(j=0;j<g.n;j++) if(g.edges[i][j]==INF) printf(" % 3s","∞"); else printf(" % 3d",g.edges[i][j]); printf("\n"); } } void DispAdj(ALGraph *G) { int i; ArcNode *p; for(i=0;i<G->n;i++) { p=G->adjlist[i].firstarc; if(p!=NULL) printf(" %3d: ",i); while(p!=NULL)//對所有相鄰的頂點進行處理 { printf(" %3d",p->adjvex); p=p->nextarc; } printf("\n"); } } //主函數源文件.cpp #include<stdio.h> #include<malloc.h> #include"graph.h" extern void MatToList(MGraph,ALGraph *&);//外部文件中 extern void ListToMat(ALGraph *,MGraph &); extern void DispMat(MGraph); extern void DispAdj(ALGraph *); void main() { int i,j; MGraph g,g1; ALGraph *G; int A[MAXV][6]= { {0,5,0,7,0,0}, {0,0,4,0,0,0}, {8,0,0,0,0,9}, {0,0,5,0,0,6}, {0,0,0,5,0,0}, {3,0,0,0,1,0} }; g.n=6; g.e=10; for(i=0;i<g.n;i++)//建立圖8.1所示的鄰接矩陣 for(j=0;j<g.n;j++) g.edges[i][j]=A[i][j]; printf("\n"); printf(" 有向圖G的鄰接矩陣:\n"); DispMat(g); G=(ALGraph *)malloc(sizeof(ALGraph)); printf(" 圖G的鄰接矩陣轉換成鄰接表:\n"); MatToList(g,G); DispAdj(G); printf(" 圖G的鄰接矩表轉換成鄰接矩陣:\n"); ListToMat(G,g1); DispMat(g1); printf("\n"); }