1. 程式人生 > >圖的大總結

圖的大總結

一、資料結構定義

1.鄰接矩陣的定義:

const int MAX=100;  //頂點數目的最大值
struct MatrixG{ int vexNum; //頂點數 int edgeNum; //邊數 char vex[MAX]; //頂點表 int edge[MAX][MAX]; //邊表 };

 

2.鄰接表的定義:

const int MAX=100;  //頂點數目的最大值

struct ENode{    // 邊表結點
    int adjvex;   // 該弧所指向的頂點的位置
int info; //邊的權值 ENode *next; // 指向下一條弧的指標 }; struct VNode //頂點表結點 { char data; // 頂點資訊 ENode *first; // 指向第一條依附該頂點的弧的指標 }; struct AlistG{ int vexNum; // 圖的頂點數 int arcNum; // 圖的弧數 VNode *vexs[MAX]; //鄰接表 };

 

二、鄰接矩陣和鄰接表的轉換
1.鄰接矩陣轉鄰接表

void MatrixGToAlistG(MatrixG mg,AlistG ag){
    int n=mg->vexNum;
    for(int i=1;i<=n;++i)   //鄰接表表頭初始化
        ag[i].first=NULL;
    for(int i=1;i<n;++i)
        for(int j=1;j<=n;++j){
            if(mg->edge[i][j]==1){  //如果i與j鄰接,則將j插入i的鄰接表中
                ENode *p=new ENode;
                p
->adjvex=j; p->next=ag[i]->first; ag[i]->first=p; } }

2.鄰接錶轉鄰接矩陣

void AlistGToMatrixG(AlistG ag,MatrixG mg){
    int n=mg->vexNum;
    for(int i=1;i<=n;++i)   //鄰接矩陣初始化
        for(int j=1;j<=n;++j)
            mg->edge[i][j]=0;
    for(int i=1;i<=n;++i){
        p=ag[i]->first; //取第一個鄰接點
        while(p){
            mg->edge[i][p->adjvex]=1;
            p=p->next;
        }
    }
        
}

 

三、圖的遍歷

1.圖的廣度優先搜尋遍歷

 

2.圖的深度優先搜尋遍歷(遞迴)

 

3.圖的深度優先搜尋遍歷(非遞迴)