国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

鄰接矩陣與鄰接表的輸出及其相互轉(zhuǎn)換

這篇具有很好參考價(jià)值的文章主要介紹了鄰接矩陣與鄰接表的輸出及其相互轉(zhuǎn)換。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

(1) 文件1:?pubuse.h 是公共使用的常量定義和系統(tǒng)函數(shù)調(diào)用聲明。

#include<string.h>
#include<ctype.h>
#include<malloc.h> /* malloc()等*/
#include<limits.h> /* INT_MAX 等*/
#include<stdio.h> /* EOF(=^Z 或F6),NULL */
#include<stdlib.h> /* atoi() */
#include<io.h> /* eof() */
#include<math.h> /* floor(),ceil(),abs() */
#include<process.h> /* exit() */
/* 函數(shù)結(jié)果狀態(tài)代碼*/
#define TRUE  1
#define FALSE  0
#define OK  1
#define ERROR  0
#define INFEASIBLE  -1
typedef int Status; /* Status 是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK 等*/
typedef int Boolean; /* Boolean 是布爾類型,其值是TRUE 或FALSE */

2)文件GraphDef.h定義了圖的鄰接矩陣表示類型和鄰接表表示類型,該頭文件在下面的程序中都會(huì)使用到,其代碼如下:

#define MAXV 100          //最大頂點(diǎn)個(gè)數(shù)
//以下定義類型
typedef struct
{
    int no;                 //頂點(diǎn)編號(hào)
    InfoType info;           //頂點(diǎn)其他信息,這里用于存放邊的權(quán)值
}VertexType;               //頂點(diǎn)類型
typedef struct                   //圖的定義
{
    int edges[MAXV][MAXV];     //鄰接矩陣
    int n, e;                       //頂點(diǎn)數(shù)、弧數(shù)
    VertexType vex[MAXV];        //存放頂點(diǎn)信息
}MGraph;                     //圖的鄰接矩陣類型
//以下定義鄰接表類型
typedef struct  Anode          //弧的結(jié)點(diǎn)結(jié)構(gòu)類型
{
    int adjvex;                 //該弧的終點(diǎn)位置
    struct  Anode* nextarc;      //指向下一條弧的指針
    InfoType  info;             //該弧的相關(guān)信息,這里用于存放權(quán)值
}ArcNode;
typedef  int Vertex;
typedef struct Vnode           //鄰接表頭結(jié)點(diǎn)的類型
{
    Vertex data;                 //頂點(diǎn)信息
    ArcNode* firstarc;           //指向第一條弧
}VNode;
typedef  VNode  AdjList[MAXV];        //AdjList是鄰接表類型
typedef struct
{
    AdjList adjlist;              //鄰接表
        int n, e;                      //圖中頂點(diǎn)數(shù)n和邊數(shù)e
}ALGraph;                      //圖的鄰接表類型

(3)頭文件GraphAlgo4-1.h包含若干圖的操作函數(shù)

1.將鄰接矩陣轉(zhuǎn)化為鄰接表

#define INF 32767                    //INF表示
void MatToList(MGraph g, ALGraph *&G)  //將鄰接矩陣g轉(zhuǎn)換成鄰接表G
{
    int i, j, n = g.n;                           // n為頂點(diǎn)數(shù)
    ArcNode* p;
    G = (ALGraph*)malloc(sizeof(ALGraph));
    for (i = 0; i < n; i++)                      //給鄰接表中所有頭結(jié)點(diǎn)的指針域置初值
        G->adjlist[i].firstarc = NULL;
    for (i = 0; i < n; i++)                      //檢查鄰接矩陣中每個(gè)元素
        for (j = n - 1; j >= 0; j--)
            if (g.edges[i][j] != 0)               //鄰接矩陣的當(dāng)前元素不為0
            {
                p = (ArcNode*)malloc(sizeof(ArcNode));  //創(chuàng)建一個(gè)結(jié)點(diǎn)*p
                p->adjvex = j;
                p->info = g.edges[i][j];                 //存放邊的權(quán)值    
                p->nextarc = G->adjlist[i].firstarc;        //將*p插入到鏈表中,頭插法
                G->adjlist[i].firstarc = p;
            }
    G->n = g.n;
    G->e = g.e;
}

2.將鄰接表轉(zhuǎn)化為鄰接矩陣

void ListToMat(ALGraph* G, MGraph& g)       //將鄰接表G轉(zhuǎn)換成鄰接矩陣g
{
    int i, j, n = G->n;
    ArcNode* p;
    for (i = 0; i < n; i++)                             //g.edges[i][j]賦初值0
        for (j = n - 1; j >= 0; j--)
            g.edges[i][j] = 0;
    for (i = 0; i < n; i++)
    {
        p = G->adjlist[i].firstarc;
        while (p != NULL)                      //對(duì)所有相鄰頂點(diǎn)進(jìn)行處理
        {
            g.edges[i][p->adjvex] = p->info;
            p = p->nextarc;
        }
    }
    g.n = n;
    g.e = G->e;
}

?3.進(jìn)行鄰接矩陣與鄰接表的輸出

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)                      //輸出鄰接表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)                        //對(duì)所有相鄰頂點(diǎn)進(jìn)行處理
        {
            printf("%3d",p->adjvex);//應(yīng)該輸出每個(gè)鄰接表的頂點(diǎn)數(shù)據(jù)
            p = p->nextarc;
           
        }
        printf("\n");
    }
}

(3)源程序exp4-1.cpp 實(shí)現(xiàn)圖的操作函數(shù)的測(cè)試文件。

#include “pubuse.h”
#include “GraphDef.h”
#include “GraphAlgo.h”
void main()
{
    int i, j;
    MGraph g,g1;
    ALGraph* G;
    printf("建立一個(gè)有向圖:\n");      //自己設(shè)計(jì)一個(gè)有向圖 
    printf("輸入有向圖的頂點(diǎn)數(shù):");
    scanf_s("%d", &g.n);
    printf("建立 %d * %d的矩陣:\n", g.n, g.n);
    for (i = 0; i < g.n; i++)
        for (j = 0; j < g.n; j++)
        {
            printf("輸入頂點(diǎn) % d到頂點(diǎn) % d的權(quán)值, 無弧的用0表示:\n",i,j);
            scanf_s("%d", &g.edges[i][j]);     //用矩陣存儲(chǔ)兩頂點(diǎn)弧上的權(quán)值

        }
    g.e = 0;
    for (i = 0; i < g.n; i++)
        for (j = 0; j < g.n; j++)
            if (g.edges[i][j] != 0)
                g.e++;
    printf("有向圖G的鄰接矩陣:\n");
    DispMat(g);
    G = (ALGraph*)malloc(sizeof(ALGraph));
    printf("圖的鄰接矩陣轉(zhuǎn)換成鄰接表:\n");
    MatToList(g, G);
    DispAdj(G);
    printf("圖G的鄰接表轉(zhuǎn)換成鄰接矩陣:\n");
    ListToMat(G, g1);
    DispMat(g1);
    printf("\n");
}

運(yùn)行代碼如下所示:

鄰接矩陣與鄰接表的輸出及其相互轉(zhuǎn)換文章來源地址http://www.zghlxwxcb.cn/news/detail-505931.html

到了這里,關(guān)于鄰接矩陣與鄰接表的輸出及其相互轉(zhuǎn)換的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包