第十二周项目2—操作用邻接表存储的图

 copyright (c) 2016,烟台大学计算机学院 
 All rights reserved. 
 文件名称:1.cpp 
 作者:孟令康
 完成日期:2016年9月12日 
 版本号:v1.0 
 问题描述: 假设图G采用邻接表存储,分别设计实现以下要求的算法   
 输入描述:若干测试数据。  
 程序输出:DFS,BFS的遍历序列。

 代码

graph.h:

#ifndef GRAPH_H_INCLUDED    
#define GRAPH_H_INCLUDED    
#include <stdio.h>    
#include <malloc.h>    
#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.cpp:

#include <stdio.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)    
                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]    
            {    
                p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*p    
                p->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+
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用 C++ 邻接表存储的方法如下: 1. 定义一个结构体,表示每个结点的信息,如结点编号,数据等。 2. 定义一个结构体或类,表示信息,如结点的数量,边的数量等。 3. 定义一个邻接表存储每个结点的邻接结点信息。 4. 实现的读入和输出功能。 5. 实现其他的算法,如深度优先搜索,广度优先搜索等。 以下是简单的代码示例: ```c++ #include <iostream> #include <vector> using namespace std; // 定义结点结构体 struct Node { int id; // 结点编号 int data; // 结点数据 }; // 定义邻接表 vector<vector<int>> adjList; int main() { // 初始化邻接表 int n = 5; // 结点数量 adjList.resize(n); // 加边 for (int i = 0; i < n; i++) { int u, v; cin >> u >> v; adjList[u].push_back(v); adjList[v].push_back(u); } // 显示邻接表 for (int i = 0; i < n; i++) { cout << "结点 " << i << " 的邻接结点有:"; for (int j = 0; j < adjList[i].size(); j++) { cout << adjList[i][j] << " "; } cout << endl; } return 0; } ``` 这是一个简单的邻接表存储的示例代码,其 ### 回答2: 邻接表是一种常用的存储的数据结构,它通过建立一个顶点数组和一个链表数组来表示。下面我将用300字来回答关于使用C++的邻接表存储问题。 首先,我们需要定义一个结构体来表示的顶点,该结构体包括顶点的编号、顶点的属性以及存储与该顶点相邻的其他顶点的链表。 接着,我们需要定义一个数组来存储顶点,并根据实际情况来确定数组的大小。 然后,我们需要定义一个链表结构体,该结构体包括一个指向相邻顶点的指针以及一个指向下一个节点的指针。 接下来,我们需要根据输入的边的信息来构建。我们可以使用一个循环来遍历输入的边,然后在邻接表每个顶点添加相邻的顶点。 最后,我们可以根据需求实现其他操作,例如查找一个顶点的相邻顶点、判断两个顶点是否相邻等。 使用C++的邻接表存储有以下优点: 1. 内存效率高:邻接表存储了顶点之间的关系,不需要存储所有可能的边,因此节省了内存空间。 2. 插入和删除边的操作效率高:邻接表只需要修改链表结构,不需要移动其他元素。 3. 可以灵活地表示带有属性的顶点和边:我们可以在顶点和边的结构添加属性,以满足不同的需求。 总的来说,使用C++的邻接表存储是一种高效、灵活的方法,适用于的遍历、搜索、最短路径等常见操作。 ### 回答3: C++使用邻接表存储是一种常见的方法。邻接表是一种基于链表的数据结构,可以有效地表示的顶点和边。 邻接表由一个顶点数组和一个边链表数组组成。顶点数组每个元素表示一个顶点,而边链表数组每个元素表示与该顶点相邻的边的集合。顶点数组每个元素都指向一个边链表,边链表每个元素都存储了与该顶点相邻的另一个顶点的信息。 使用邻接表可以方便地进行的遍历和查找操作。例如,可以通过遍历顶点数组的元素来获取的所有顶点,而通过遍历边链表数组的元素可以获取某个顶点的所有相邻顶点。 在使用邻接表进行操作时,可以使用动态内存分配来动态地创建和修改的结构。因为邻接表使用链表来表示边,所以在增加和删除边的操作上更加高效。此外,邻接表还占用较少的内存空间,适用于存储大型的稀疏。 总结来说,使用C++邻接表存储是一种高效、灵活且节省内存的方法。它可以方便地进行的遍历和查找操作,适用于存储大型的稀疏

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值