第十一周项目实践1 图基本算法库
生活随笔
收集整理的這篇文章主要介紹了
第十一周项目实践1 图基本算法库
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED#define MAXV 100 //最大頂點個數
#define INF 32767 //INF表示∞
typedef int InfoType;//以下定義鄰接矩陣類型
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; //頂點信息int count; //存放頂點入度,只在拓撲排序中用ArcNode *firstarc; //指向第一條弧
} VNode;typedef VNode AdjList[MAXV]; //AdjList是鄰接表類型typedef struct
{AdjList adjlist; //鄰接表int n,e; //圖中頂點數n和邊數e
} ALGraph; //圖的鄰接表類型//功能:由一個反映圖中頂點鄰接關系的二維數組,構造出用鄰接矩陣存儲的圖
//參數:Arr - 數組名,由于形式參數為二維數組時必須給出每行的元素個數,在此將參數Arr聲明為一維數組名(指向int的指針)
// n - 矩陣的階數
// g - 要構造出來的鄰接矩陣數據結構
void ArrayToMat(int *Arr, int n, MGraph &g); //用普通數組構造圖的鄰接矩陣
void ArrayToList(int *Arr, int n, ALGraph *&); //用普通數組構造圖的鄰接表
void MatToList(MGraph g,ALGraph *&G);//將鄰接矩陣g轉換成鄰接表G
void ListToMat(ALGraph *G,MGraph &g);//將鄰接表G轉換成鄰接矩陣g
void DispMat(MGraph g);//輸出鄰接矩陣g
void DispAdj(ALGraph *G);//輸出鄰接表G#endif // GRAPH_H_INCLUDED
graph.h:
#include <stdio.h> #include <malloc.h> #include "graph.h" //功能:由一個反映圖中頂點鄰接關系的二維數組,構造出用鄰接矩陣存儲的圖 //參數:Arr - 數組名,由于形式參數為二維數組時必須給出每行的元素個數,在此將參數Arr聲明為一維數組名(指向int的指針) // n - 矩陣的階數 // g - 要構造出來的鄰接矩陣數據結構 void ArrayToMat(int *Arr, int n, MGraph &g) {int i,j,count=0; //count用于統計邊數,即矩陣中非0元素個數g.n=n;for (i=0; i<g.n; i++)for (j=0; j<g.n; j++){g.edges[i][j]=Arr[i*n+j]; //將Arr看作n×n的二維數組,Arr[i*n+j]即是Arr[i][j],計算存儲位置的功夫在此應用//更顯示了二維數組在內存中的存儲機制if(g.edges[i][j]!=0 && g.edges[i][j]!=INF)count++;}g.e=count; } void ArrayToList(int *Arr, int n, ALGraph *&G) {int i,j,count=0; //count用于統計邊數,即矩陣中非0元素個數ArcNode *p;G=(ALGraph *)malloc(sizeof(ALGraph));G->n=n;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 (Arr[i*n+j]!=0) //存在一條邊,將Arr看作n×n的二維數組,Arr[i*n+j]=Arr[i][j](n是有多少列){p=(ArcNode *)malloc(sizeof(ArcNode)); //創建一個節點*pp->adjvex=j;p->info=Arr[i*n+j];p->nextarc=G->adjlist[i].firstarc; //采用頭插法插入*p,和鏈表的操作一樣G->adjlist[i].firstarc=p;}G->e=count; } void MatToList(MGraph g, ALGraph *&G) //將鄰接矩陣g轉換成鄰接表G {int i,j;ArcNode *p;G=(ALGraph *)malloc(sizeof(ALGraph));for (i=0; i<g.n; i++) //給鄰接表中所有頭節點的指針域置初值G->adjlist[i].firstarc=NULL;for (i=0; i<g.n; i++) //檢查鄰接矩陣中每個元素for (j=g.n-1; j>=0; j--)if (g.edges[i][j]!=0) //存在一條邊{p=(ArcNode *)malloc(sizeof(ArcNode)); //創建一個節點*pp->adjvex=j;p->info=g.edges[i][j];p->nextarc=G->adjlist[i].firstarc; //采用頭插法插入*pG->adjlist[i].firstarc=p;}G->n=g.n;G->e=g.e; } void ListToMat(ALGraph *G,MGraph &g) //將鄰接表G轉換成鄰接矩陣g {int i,j;ArcNode *p;g.n=G->n; //根據一樓同學“舉報”改的。g.n未賦值,下面的初始化不起作用g.e=G->e;for (i=0; i<g.n; i++) //先初始化鄰接矩陣for (j=0; j<g.n; j++)g.edges[i][j]=0;for (i=0; i<G->n; i++) //根據鄰接表,為鄰接矩陣賦值{p=G->adjlist[i].firstarc;while (p!=NULL){g.edges[i][p->adjvex]=p->info;p=p->nextarc;}} } 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","∞");elseprintf("%3d",g.edges[i][j]);printf("\n");} } void DispAdj(ALGraph *G) //輸出鄰接表G {int i;ArcNode *p;for (i=0; i<G->n; i++){p=G->adjlist[i].firstarc;printf("%3d: ",i);while (p!=NULL){printf("-->%d/%d ",p->adjvex,p->info);p=p->nextarc;}printf("\n");} } main.cpp: #include <stdio.h> #include <malloc.h> #include "graph.h"int main() {MGraph g1,g2;ALGraph *G1,*G2;int A[6][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}};ArrayToMat(A[0], 6, g1); //取二維數組的起始地址作實參,用A[0],因其實質為一維數組地址,與形參匹配printf(" 有向圖g1的鄰接矩陣:\n");DispMat(g1);ArrayToList(A[0], 6, G1);printf(" 有向圖G1的鄰接表:\n");DispAdj(G1);MatToList(g1,G2);printf(" 圖g1的鄰接矩陣轉換成鄰接表G2:\n");DispAdj(G2);ListToMat(G1,g2);printf(" 圖G1的鄰接表轉換成鄰接鄰陣g2:\n");DispMat(g2);printf("\n");return 0; }總結
以上是生活随笔為你收集整理的第十一周项目实践1 图基本算法库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sdut 2107 DFS
- 下一篇: 第十一周项目实践2 用邻接表存储的图来实