数据结构与算法——实验3 图的建立与操作

简介: 在熟悉图的存储、遍历、及其应用的基础上,通过键盘输入数据,建立一个无向图的邻接表,输出该邻接表,并计算每个顶点的度。达到巩固图的存储思想及其存储实现。完成下图的邻接表表示,并计算每个顶点的度。附加要求:进行深度优先和广度优先遍历

实验目的和要求

在熟悉图的存储、遍历、及其应用的基础上,通过键盘输入数据,建立一个无向图的邻接表,输出该邻接表,并计算每个顶点的度。达到巩固图的存储思想及其存储实现。

实验内容

完成下图的邻接表表示,并计算每个顶点的度。

附加要求:进行深度优先和广度优先遍历

image.gif编辑

实验时间:2020年11月10日(周二1,2节)

实验地点:10号楼413

实验提示:

1.类型定义(邻接表存储)

#define MAX_VERTEX_NUM 8 //顶点最大个数

typedef struct ArcNode

{

int adjvex;

struct ArcNode *nextarc;

int weight; //边的权

}ArcNode; //表结点

#define VertexType char //顶点元素类型

typedef struct VNode

{

int degree;//顶点的度,入度

VertexType data;

ArcNode *firstarc;

}VNode/*头结点*/,AdjList[MAX_VERTEX_NUM];

typedef struct{

AdjList vertices;

int vexnum,arcnum;//顶点的实际数,边的实际数

}ALGraph;

程序流程图

image.gif编辑

程序代码

#include <iostream>
#include <stdio.h>
#include <queue>
using namespace std;
const int max_n = 100;
bool vi[max_n];
int num[max_n] = { 0 };
queue<int>q;
typedef struct ArcNode
{
  char adjvex;//该弧所指向的顶点的位置 
  struct ArcNode *nextarc;//指向下一条弧的指针 
}ArcNode; //表结点 
typedef struct VNode
{
  char data;//顶点信息 
  ArcNode *firstarc;//指向第一条依附该顶点的弧的指针 
}VNode/*头结点*/,AdjList[max_n]; 
typedef struct
{ 
  AdjList vertices;
  int vexnum,arcnum;//顶点的实际数,边的实际数
}AlGraph;
int locat(AlGraph g, char v) {
    for (int i = 0; i < g.vexnum; i++) {
        if (g.vertices[i].data == v)
            return i;
    }
}
void creatGraph(AlGraph& g) {
    ArcNode* p1;
    ArcNode* p2;
    printf("请输入图的顶点个数和边的条数:\n");
    cin >> g.vexnum >> g.arcnum;
    printf("请输入顶点的信息:\n"); 
    for (int i = 0; i < g.vexnum; i++) {
      cin >> g.vertices[i].data;
        g.vertices[i].firstarc = NULL;
    }
    char v1, v2;
    printf("请输入弧的相邻两个顶点\n");
    for (int j = 0; g.arcnum > j; j++) {
      cin >> v1 >> v2;
        char a = locat(g, v1);//v1的位置 
        char b = locat(g, v2);//v2的位置 
        p1 = new ArcNode;
        p2 = new ArcNode;
        p1->adjvex = b;
        p1->nextarc = g.vertices[a].firstarc;
        g.vertices[a].firstarc = p1;
        p2->adjvex = a;
        p2->nextarc = g.vertices[b].firstarc;
        g.vertices[b].firstarc = p2;
        num[a] =num[a] + 1;//度加一 
        num[b] =num[b] + 1;
    }
}
void dfs(AlGraph g, int v) {
  printf("%c",g.vertices[v].data);
    vi[v] = true;
    ArcNode* p;
    p = g.vertices[v].firstarc;
    while (p != NULL) {
        int w = p->adjvex;
        if (!vi[w])
            dfs(g, w);
        p = p->nextarc;
    }
}
void bfs(AlGraph g, int v) {
  printf("%c",g.vertices[v].data);
    vi[v] = true;
    q.push(v);
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        ArcNode* p;
        p = g.vertices[u].firstarc;
        while (p != NULL) {
            if (!vi[p->adjvex]) {
                cout << g.vertices[p->adjvex].data;
                vi[p->adjvex] = true;
                q.push(p->adjvex);
            }
            p = p->nextarc;
        }
    }
}
int main() {
    AlGraph g;
    creatGraph(g);
    int n = 0;
  for(int n=0;n<g.vexnum;n++) 
      printf("点%c的度为:%d\n",g.vertices[n].data,num[n]);
    printf("深度优先搜索:\n");
    dfs(g, 0);
    for (int i = 0; i < max_n; i++) {
        vi[i] = false;
    }
    printf("\n广度优先搜索:\n"); 
    bfs(g, 0);
    return 0;
}

image.gif

运行结果及分析

image.gif编辑

输入图的顶点和弧的个数,从而输入顶点信息和相对应弧的相邻两个顶点,建立图的邻接表,进而输出每个顶点的度,利用深度优先搜索和广度优先搜索进行图的遍历。

心得体会

通过此次实验,学会了构建图的邻接表,并且学习到了两种方式遍历图的顶点,对以后的学习有了很大帮助。

相关文章
|
5月前
|
存储 算法 数据安全/隐私保护
【Python学习篇】Python实验小练习——高级数据结构(五)
【Python学习篇】Python实验小练习——高级数据结构(五)
65 1
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
105 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
5月前
|
存储 算法 数据挖掘
数据结构实验||约瑟夫环
数据结构实验||约瑟夫环
|
1月前
|
算法
计科一二班算法数据结构实验9答案
计科一二班算法数据结构实验9答案
14 0
|
3月前
|
算法 Java 测试技术
算法分析(蛮力法与减治算法应用实验报告)
这篇文章是关于算法分析的实验报告,介绍了如何使用蛮力法解决背包问题,并通过伪代码和Java代码实现,同时分析了其时间效率;还介绍了基于减治法思想实现的二叉查找树的插入与查找,同样提供了伪代码、Java源代码实现和时间效率分析,最后展示了测试结果截图。
算法分析(蛮力法与减治算法应用实验报告)
|
3月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
3月前
|
算法 Java 测试技术
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
这篇文章介绍了基于动态规划法的三种算法:解决背包问题的递归和自底向上实现、Warshall算法和Floyd算法,并提供了它们的伪代码、Java源代码实现以及时间效率分析。
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
|
3月前
|
算法 搜索推荐
算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题
这篇文章是关于分治法应用的实验报告,详细介绍了如何利用分治法实现合并排序和快速排序算法,并探讨了使用分治法解决二维平面上的最近对问题的方法,包括伪代码、源代码实现及时间效率分析,并附有运行结果和小结。
|
4月前
|
机器学习/深度学习 存储 算法
数据结构与算法:数组的操作
数据结构与算法:数组的操作
|
5月前
|
存储 算法 Python
数据结构与算法 - 图
数据结构与算法 - 图
27 0