数据结构学习笔记----【图】邻接矩阵和邻接表转换代码

数据结构学习笔记----【图】邻接矩阵和邻接表转换代码


转载参考:https://blog.csdn.net/qwm8777411/article/details/8990718

邻接矩阵–>邻接表

要求

带权 有向图 邻接矩阵表示 转换为 邻接表

INPUT

1.图的节点数、图的边数 m n
2. n*n 矩阵(数字间以空格空开,非零表示权)

OUTPUT

m个结点 则输出m行
对应结点连接情况

SAMPLE

6 10
0 5 0 7 0 0
0 0 4 0 0 0
8 0 0 0 0 0
0 0 5 0 0 6
0 0 5 0 0 0
3 0 0 0 1 0

0:1 3
1:2
2:0
3:2 5
4:2
5:0 4

代码实现

`# include<stdio.h>
# include <malloc.h>

#include <iostream>
using namespace std;
typedef  int InfoType;
#define MAXV 100    //最大顶点个数
#define INF 32767   //INF 正无穷

//定义邻接矩阵类型
    //顶点
    typedef struct{
         int no;//定点编号
         InfoType info;//顶点其他信息
    }VertexType;//顶点类型
    //图
    typedef struct{
       int edges[MAXV][MAXV];//邻接矩阵
       int vertexNum,arcNum;//顶点数 边数
      VertexType vexs[MAXV];//存放顶点信息
    }MGraph;//图的邻接矩阵类型

//邻接表类型

//表节点类型
    typedef struct ANode{
      int adjvex; //这条弧的终点 <i,j>
      struct ANode *nextarc; //指向下一条边的指针
     InfoType infoType;//相关信息,用于存放权值
    }ArcNode;

//头节点类型
    typedef struct VNode{
        typedef int Vertex;
        Vertex data;//顶点信息
        ArcNode *firstarc;//指向第一条边
        //有趣啊,顺序&结构体
    }VNode;
    typedef VNode AdjList[MAXV];	//AdjList是邻接表类型

    typedef struct{
      AdjList adjList;
      int vertexNum,e;//顶点数和边数
    }ALGraph;

//==============================================
    //邻接矩阵转换成邻接表
    void MatToList(MGraph &M, ALGraph *&A){
        int i,j;
        ArcNode *p;

        //给邻接表分配内存
        A = (ALGraph*)malloc(sizeof(ALGraph));
        //遍历头节点 赋初值
        for(i=0;i<M.vertexNum;i++)
            A->adjList[i].firstarc=NULL;

        //遍历邻接矩阵中的所有元素
        for(i=0;i<M.vertexNum;i++)
            for(j=0;j<i;j++)
                if(M.edges[i][j]!=0) {//存在<i,j>边
                    p=(ArcNode*)malloc(sizeof(ArcNode)); //创建一个新的表结点
                    p->adjvex=j;    //弧的终点为j
                    p->nextarc=A->adjList[i].firstarc; //邻接表: 头节点 表结点;
                    // 新的表结点的链域nextarc存放 之前表结点的地址(在头节点的链域里)
                    A->adjList[i].firstarc=p;//将p接在头节点后面
                }



    }


    //输出邻接矩阵M
    void DispMat(MGraph M)
    {
        int i,j;
        for(i=0;i<M.vertexNum;i++)
            for(j=0;j<M.vertexNum;j++)
                printf("%3d",M.edges[i][j]);
            printf("\n");
    }

    //输出邻接表
    void DispAdj(ALGraph *A)
    {
        int i;
        ArcNode *p;
        for(i=0;i<A->vertexNum;i++)
        {
            p=A->adjList[i].firstarc;
            cout<<i<<":";
            while (p!=NULL)
            {
                cout<<p->adjvex<<"";
                p=p->nextarc;
            }
            printf("\n");
        }
    }


    // main
    int main(){
        int i,j;
        MGraph M;
        ALGraph *A;

        int m,n;
        cin>>n>>m;//n节点数 m边数
        int k[n][n];
        for(int i=0;i<M.vertexNum;i++){
            for(int j=0;j<M.vertexNum;j++){
                cin>>k[i][j];
            }
        }
        M.vertexNum=n;
        M.arcNum=m;

        for(i=0;i<M.vertexNum;i++)
            for(j=0;j<M.vertexNum;j++)
                M.edges[i][j]=k[i][j];

        A=(ALGraph*)malloc(sizeof(ALGraph));
        MatToList(M,A)  ;
        DispAdj(A);
    }
// 输入ok 无显示`

重点

   //邻接矩阵转换成邻接表
    void MatToList(MGraph &M, ALGraph *&A){
        int i,j;
        ArcNode *p;

        //给邻接表分配内存
        A = (ALGraph*)malloc(sizeof(ALGraph));
        //遍历头节点 赋初值
        for(i=0;i<M.vertexNum;i++)
            A->adjList[i].firstarc=NULL;

        //遍历邻接矩阵中的所有元素
        for(i=0;i<M.vertexNum;i++)
            for(j=0;j<i;j++)
                if(M.edges[i][j]!=0) {//存在<i,j>边
                    p=(ArcNode*)malloc(sizeof(ArcNode)); //创建一个新的表结点
                    p->adjvex=j;    //弧的终点为j
                    p->nextarc=A->adjList[i].firstarc; //邻接表: 头节点 表结点;
                    // 新的表结点的链域nextarc存放 之前表结点的地址(在头节点的链域里)
                    A->adjList[i].firstarc=p;//将p接在头节点后面
                }



    }

邻接表—>邻接矩阵


void ListToMat(ALGraph *A,MGraph &M)

{	int i;
	ArcNode *p;
	for (i=0;i<A->vertexNum;i++)
	{	p=A->adjlist[i].firstarc;
		while (p!=NULL)
		{	M.edges[i][p->adjvex]=1;
			p=p->nextarc;
		}
	}
	
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
"一、实验目的和要求 " "(1)掌握的相关概念,包括,有向,无向,完全,子,连通,度,入 " "度,出度,简单回路和环等定义。 " "(2)重点掌握的各种存储结构,包括邻接矩阵邻接表等。 " "(3)重点掌握的基本运算,包括创建,输出,深度优先遍历,广度优先遍历等 " "。 " "(4)掌握的其他运算 ,包括最小生成树,最短路径,拓扑排序和关键路径等算法。" "(5)灵活运用这种数据结构解决一些综合应用问题。 " "二、实验内容和方法 " "(1)实验内容: " "1、编写一个程序algo8-1.cpp,实现不带权和带权邻接矩阵邻接表的相互转换" "算法、输出邻接矩阵邻接表算法,并在此基础上设计一个程序exp8-1.cpp实现如下" "功能: " " 建立如1所示的有向G的邻接矩阵,并输出; " " 由有向G的邻接矩阵产生邻接表,并输出; " " 再由 的邻接表产生对应的邻接矩阵,并输出。 " " " " " " " " " " " " " " " " " "1 " " " " " "2、编写一个程序algo8-2.cpp,实现的遍历运算,并在此基础上设计一个程序exp8-2" ".cpp完成如下功能: " " 输出1所示的有向G从顶点0开始的深度优先遍历序列(递归算法); " " 输出1所示的有向G从顶点0开始的深度优先遍历序列(非递归算法); " " 输出1所示的有向G从顶点0开始的广度优先遍历序列。 " " " "3、设计一个程序exp8-3.cpp,采用邻接表存储,并输出8.1(a)中从指定顶点1出 " "发的所有深度优先遍历序列。 " " " "(2)实验方法: " "1、综合运用课本所学的知识,用不同的算法实现在不同的程序功能。 " "2、结合指导老师的指导,解决程序中的问题,正确解决实际中存在的异常情况,逐步 " "改善功能。 " "3、根据实验内容,编译程序。 " " " "三、实验环境: " "Windows 7,Visual C++6.0 " "三、实验过程描述 " "文件graph.h中定义了邻接矩阵表示类型和邻接表表示类型,该头文件在以下三个 " "实验中都会使用到。其代码如下: " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "实验 " "源程序。 " "一、输入如下所示程序; " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "二、编译并链接程序; " " " "三、运行程序,结果如下: " " " " " "实验 " "源程序 " "一、输入如下所示程序; " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值