图的基本算法——C/C++

图的结构体定义

typedef struct vertex {
    int number;					//顶点的编号
}VertexType; 					//别名,顶点的类型

typedef struct matrix {
    int n;						//顶点个数
    int e;						//边数
    int adjMat[MAXV][MAXV];		//邻接矩阵数组
    VertexType ver[MAXV];		//存放顶点信息
}MatGraph;						//别名,完整的图邻接矩阵类型

typedef struct eNode {
    int adjVer;					//该边的邻接点编号
    int weight;					//该边的的信息,如权值
    struct eNode* nextEdge;		//指向下一条边的指针
}EdgeNode; 						//别名,边结点的类型

typedef struct vNode {
    EdgeNode* firstEdge;		//指向第一个边结点
}VNode; 						//别名,邻接表的头结点类型

typedef struct list {
    int n;						//顶点个数
    int e;						//边数
    VNode adjList[MAXV];		//邻接表的头结点数组
}ListGraph;						//别名,完整的图邻接表类型

函数

//创建图的邻接表
void createAdjListGraph(ListGraph*& LG, int A[MAXV][MAXV], int n, int e)
根据邻接矩阵数组A、顶点个数n、边数e来建立图的邻接表 LG(采用邻接表指针方式):1)为邻接表分配LG的存储空间,并将所有头结点的firstEdge指针置为空(NULL)。
(2)扫描数组A查找不为0的元素,若找到这样的元素A[i][j],创建一个adjVer域为 j、weight域为A[i][j]的边结点。
(3)采用头插法将他插入到第 i 个单链表中。

 //输出邻接表
void displayAdjList(ListGraph* LG)1)扫描邻接表LG的头结点数组adjList.2)对于每个单链表,先输出头结点的顶点信息(这里输出编号).3)然后逐一输出单链表中的所有结点的信息。

//输出邻接矩阵
void displayAdjMat(MatGraph MG)
这个就和数组的输出一样,只是要判断临界条件
 
 //邻接表转换为邻接矩阵
void ListToMat(ListGraph* LG, MatGraph &MG)1)在图的邻接矩阵MG查找不为0、不为 ∞ 的元素。
(2)若找到这样的元素MG.adjMat[i][j],创建一个adjVer域为 j、weight域为MG.adjMat[i][j]的边结点。
(3)采用头插法将他插入到第 i 个单链表中。

 //销毁图
void destroyAdjListGraph(ListGraph* LG)


完整代码

#include <stdio.h>
#include <cstdlib>

#define MAXV 5					//最大顶点个数
#define INF 32767				//定义 ∞


typedef struct vertex {
    int number;					//顶点的编号
}VertexType; 					//别名,顶点的类型

typedef struct matrix {
    int n;						//顶点个数
    int e;						//边数
    int adjMat[MAXV][MAXV];		//邻接矩阵数组
    VertexType ver[MAXV];		//存放顶点信息
}MatGraph;						//别名,完整的图邻接矩阵类型

typedef struct eNode {
    int adjVer;					//该边的邻接点编号
    int weight;					//该边的的信息,如权值
    struct eNode* nextEdge;		//指向下一条边的指针
}EdgeNode; 						//别名,边结点的类型

typedef struct vNode {
    EdgeNode* firstEdge;		//指向第一个边结点
}VNode; 						//别名,邻接表的头结点类型

typedef struct list {
    int n;						//顶点个数
    int e;						//边数
    VNode adjList[MAXV];		//邻接表的头结点数组
}ListGraph;						//别名,完整的图邻接表类型

//根据邻接矩阵来创建图的邻接表
//其实就是利用图,将邻接矩阵转化为邻接表,void MatToList(MatGraph MG, ListGraph* &LG)
//参数A=MG.adjMat[i][j],n = MG.n,e = MG.e
void createAdjListGraph(ListGraph*& LG,int A[MAXV][MAXV],int n,int e){
    int i,j;
    EdgeNode *p;
    LG = (ListGraph*)malloc(sizeof(ListGraph));
    for(i=0;i<n;i++){
        LG->adjList[i].firstEdge = NULL;
    }
    for (i = 0; i < n; ++i) {
        for (j = n-1; j >= 0; ++j) {
            if (A[i][j]!=0){
                p = (EdgeNode*)malloc(sizeof(EdgeNode));
                p->adjVer = j;
                p->weight = A[i][j];
                p->nextEdge = LG->adjList[i].firstEdge;
                LG->adjList[i].firstEdge = p;
            }
        }
    }
    LG->n = n;
    LG->e = e;
}

//根据邻接表转化为邻接矩阵
void ListToMat(ListGraph* LG,MatGraph &MG){
    int i,j;
    EdgeNode *p;
    for ( i = 0; i < MAXV; ++i) {
        for ( j = 0; j < MAXV; ++j) {
            MG.adjMat[i][j] = 0;
        }
    }
    for ( i = 0; i < LG->n; ++i) {
        p = LG->adjList[i].firstEdge;
        while (p != NULL){
            MG.adjMat[i][p->adjVer] = p->weight;
            p = p->nextEdge;
        }
    }
    MG.n = LG->n;
    MG.e = LG->e;
}

//输出邻接表:扫描邻接表并输出
void displayAdjList(ListGraph*& LG){
    int i;
    EdgeNode *p;
    for (i = 0; i < MAXV; ++i) {
        p = LG->adjList[i].firstEdge;
        printf("%d:",i);
        while (p != NULL){
            if (p->weight!=INF){
                printf("%2d[%d]->",p->adjVer,p->weight);
            }
            p = p->nextEdge;
        }
        printf("NULL\n");
    }
}

//输出邻接矩阵:扫描图的邻接矩阵并输出
void displayAdjMat(MatGraph MG) {
    int i, j;
    for (i = 0; i < MAXV; i++) {
        for (j = 0; j < MAXV; j++) {
            if (MG.adjMat[i][j] == 0) {
                printf("%4s", "0");
            }
            else if (MG.adjMat[i][j] == INF) {
                printf("%4s", "∞");
            }
            else {
                printf("%4d", MG.adjMat[i][j]);
            }
        }
        printf("\n");
    }
}

//销毁图
void destroyAdjListGraph(ListGraph* LG) {
    int i;
    EdgeNode* pre, * p;
    for (i = 0; i < LG->n; i++) {
        pre = LG->adjList[i].firstEdge;				//挨个释放内存
        if (pre != NULL) {
            p = pre->nextEdge;
            while (p != NULL) {
                free(pre);
                pre = p;
                p = p->nextEdge;
            }
            free(pre);
        }
    }
    free(LG);
}

int main() {
    ListGraph* LG;						//邻接表
    MatGraph MG;						//邻接矩阵
    int array1[MAXV][MAXV] = {			//不带权无向图
            {0,1,0,1,1},
            {1,0,1,1,0},
            {0,1,0,1,1},
            {1,1,1,0,1},
            {1,0,1,1,0}
    };
    int array2[MAXV][MAXV] = {			//不带权有向图
            {0,1,0,1,0},
            {0,0,1,1,0},
            {0,0,0,1,1},
            {0,0,0,0,0},
            {1,0,0,1,0}
    };
    int array3[MAXV][MAXV] = {			//带权无向图
            {  0,  8,INF,  5,INF},
            {  8,  0,  3,INF,INF},
            {INF,  3,  0,  9,  6},
            {  5,INF,  9,  0,INF},
            {INF,INF,  6,INF,  0}
    };
    int array4[MAXV][MAXV] = {			//带权有向图
            {  0,  8,INF,  5,INF},
            {INF,  0,  3,INF,INF},
            {INF,INF,  0,INF,  6},
            {INF,INF,  9,  0,INF},
            {INF,INF,INF,INF,  0}
    };
    int e = 5;
    createAdjListGraph(LG, array1, MAXV, e);		//创建邻接表图
    displayAdjList(LG);								//输出邻接表
    printf("\n");

    ListToMat(LG, MG);								//邻接表转换为邻接矩阵
    displayAdjMat(MG);								//输出邻接矩阵
    printf("\n");

    return 0;
}

详细讲解请转到:https://blog.csdn.net/weixin_42109012/article/details/94140343

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值