数据结构实验三 树的遍历生成树

广州大学学生实验报告

 

开课实验室:计算机科学与工程实验(电子楼418A)     2019年4月19日

学院

计算机科学与教育软件学院

年级、专业、班

计算机科学与技术

姓名

 

学号

 

实验课程名称

数据结构实验

成绩

 

实验项目名称

实验三 树的的遍历生成树

指导老师

一、实验目的

1、把图转化为程序能识别的邻接矩阵;

2、理解图的遍历方法及对应的生成树。

二、使用仪器、器材

微机一台

操作系统:Win10

编程软件:C++

三、实验内容及原理

1.图的输入:邻接矩阵直接写入源程序,或键盘输入,或读入数据文件

起始结点的输入:运行时由键盘输入

输出:生成树的边,用结点的序偶表示,

 

  • 实验过程原始数据记录

GRAPH.H

#pragma once

//图的邻接表存储结构

#define INF 32767              //定义∞

#define  MAXV 100              //最大顶点个数

#define  MAX 100                   //最大全局数组

#define MaxSize 100

typedef char InfoType;

typedef int ElemType;

typedef struct ANode

{

    int adjvex;

    struct ANode *nextarc;

    int weight;

}ArcNode;

typedef struct Vnode

{

    char info;

    ArcNode *firstarc;

}VNode;

typedef struct

{

    VNode adjlist[MAXV];

    int n, e;

}AdjGraph;

//环形队列

typedef struct

{

    ElemType data[MaxSize];

    int front, rear;      //队首和队尾指针

} SqQueue;

 

void CreateAdj(AdjGraph* &G, int A[MAXV][MAXV], int n, int e);//创建图的邻接表

void DispAdj(AdjGraph*G);//输出邻接表

void DestroyAdj(AdjGraph *&G);//销毁邻接表

void DFS(AdjGraph* G, int v);//深度优先遍历生成树

 

//---------------------------------------------------------

//--广度优先遍历中使用队列的基本运算算法-------------------

//---------------------------------------------------------

void InitQueue(SqQueue *&q);

void DestroyQueue(SqQueue *&q);

bool QueueEmpty(SqQueue *q);

bool enQueue(SqQueue *&q, ElemType e);//进栈

bool deQueue(SqQueue *&q, ElemType &e);

//---------------------------------------------------------

 

void BFS(AdjGraph *G, int v);//广度优先遍历生成树

GRAPH.CPP

#include"pch.h"

#include "graph.h"

#include"malloc.h"

#include<iostream>

using namespace std;

 

void CreateAdj(AdjGraph *& G, int A[MAXV][MAXV], int n, int e)

    {

         int i, j; ArcNode *p;

 

         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 (A[i][j] != 0 && A[i][j] != INF)   //存在一条边

                  {

                      p = (ArcNode*)malloc(sizeof(ArcNode));  //创建一个结点p

                      p->adjvex = j;   //   存放邻接点

                      p->weight = A[i][j];   //存放权

                      p->nextarc = G->adjlist[i].firstarc;   //头插法

                      G->adjlist[i].firstarc = p;

                  }

             }

         }

         G->n = n; G->e = e;

}

 

void DispAdj(AdjGraph * G)

{

    int i;

    ArcNode *p;

    for (i = 0; i < G->n; i++)

    {

         p = G->adjlist[i].firstarc;

         printf("%3d: ", i);

         while (p != NULL)

         {

             printf("%3d[%d]→", p->adjvex, p->weight);

             p = p->nextarc;

         }

         printf("∧\n");

    }

}

 

void DestroyAdj(AdjGraph *& G)

{

    int i;

    ArcNode *pre, *p;

    for (i = 0; i < G->n; i++)         //扫描所有的单链表

    {

         pre = G->adjlist[i].firstarc;  //p指向第i个单链表的首结点

         if (pre != NULL)

         {

             p = pre->nextarc;

             while (p != NULL)         //释放第i个单链表的所有边结点

             {

                  free(pre);

                  pre = p; p = p->nextarc;

             }

             free(pre);

         }

    }

    free(G);                       //释放头结点数组

}

 

int  visited[MAX] = { 0 };

void DFS(AdjGraph* G, int v)   //深度优先遍历

{

    ArcNode*p;

    visited[v] = 1;   //置已访问标记

    //cout << v << endl;  //输出被访问顶点的编号

    p = G->adjlist[v].firstarc;  //p指向顶点v的第一个邻接点

    while (p != NULL)

    {

         if (visited[p->adjvex] == 0)

         {

             cout << "(" << v << "," << p->adjvex << ")" << endl;

             DFS(G, p->adjvex);

         }

         p = p->nextarc;   //p指向顶点v的下一个邻接点

    }

}

 

void InitQueue(SqQueue *& q)

{

    q = (SqQueue *)malloc(sizeof(SqQueue));

    q->front = q->rear = 0;

}

 

void DestroyQueue(SqQueue *& q)

{

    free(q);

}

 

bool QueueEmpty(SqQueue * q)

{

    return(q->front == q->rear);

}

 

bool enQueue(SqQueue *& q, ElemType e)

{

    if ((q->rear + 1) % MaxSize == q->front)    //队满上溢出

         return false;

    q->rear = (q->rear + 1) % MaxSize;

    q->data[q->rear] = e;

    return true;

}

 

bool deQueue(SqQueue *& q, ElemType & e)

{

    if (q->front == q->rear)                //队空下溢出

         return false;

    q->front = (q->front + 1) % MaxSize;

    e = q->data[q->front];

    return true;

}

 

void BFS(AdjGraph * G, int v//广度优先遍历

{

    int w, i;

    ArcNode *p;

    SqQueue *qu;                            //定义环形队列指针

    InitQueue(qu);                              //初始化队列

    int visited[MAXV];                      //定义顶点访问标志数组

    for (i = 0; i < G->n; i++) visited[i] = 0;       //访问标志数组初始化

    //printf("%2d ", v);                        //输出被访问顶点的编号

    visited[v] = 1;                             //置已访问标记

    enQueue(qu, v);

    while (!QueueEmpty(qu))                 //队不空循环

    {

         deQueue(qu, w);                         //出队一个顶点w

         p = G->adjlist[w].firstarc;             //指向w的第一个邻接点

        while (p != NULL)                       //查找w的所有邻接点

         {

             if (visited[p->adjvex] == 0)       //若当前邻接点未被访问

             {

                  cout << "(" << w << "," << p->adjvex << ")" << endl;

                  //printf("%2d ", p->adjvex);  //访问该邻接点

                  visited[p->adjvex] = 1;        //置已访问标记

                  enQueue(qu, p->adjvex);        //该顶点进队

             }

             p = p->nextarc;                    //找下一个邻接点

         }

    }

    printf("\n");

}

 

MAIN.CPP

 

#include "pch.h"

#include <iostream>

#include"graph.h"

using namespace std;

 

int main()

{

    AdjGraph *G=new AdjGraph;

    int A[MAXV][MAXV] = { {0,1,1,1,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,0,0},

                           {1,0,0,1,0,1,1,0,0,0,0},{1,0,1,0,0,0,0,1,0,0,0},

                          {0,1,0,0,0,0,0,0,0,0,0},{0,1,1,0,0,0,0,0,0,0,0},

                          {0,0,1,0,0,0,0,1,1,1,0},{0,0,0,1,0,0,1,0,0,0,1},

                          {0,0,0,0,0,0,1,0,0,0,0},{0,0,0,0,0,0,1,0,0,0,0},

                          {0,0,0,0,0,0,0,1,0,0,0} }

    ;

    int n = 11, e = 12;

    CreateAdj(G, A, n, e);         //建立《教程》中图8.1(a)的邻接表

    //printf("图G的邻接表:\n");

    //DispAdj(G);                  //输出邻接表G

    cout << "请输入起始结点" << endl;

    int a;

    cin >> a;

    printf("深度优先序列(递归)生成树:"); printf("\n"); DFS(G, a); printf("\n");

    printf("广度优先序列生成树:"); printf("\n"); BFS(G, a); printf("\n");

    DestroyAdj(G);                 //销毁邻接表

    return 1;

}

 

五、实验结果及分析

从3出发,分别进行深度优先生成树和广度优先生成树。

从0出发,分别进行深度优先生成树和广度优先生成树。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/418895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(1800):前端调试之清除浮动练习2

<!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title><!-- 不…

java參数传递机制浅析

欢迎转载&#xff0c;转载请声明出处&#xff01;-----------------------------------------前言&#xff1a;java语言中&#xff0c;參数的传递仅仅有一种机制。那就是值传递。 举例&#xff1a;以下将通过几个样例来说明java中的參数传递机制&#xff0c;这些样例基本涵盖了…

数据库实验四 用户权限管理

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼418B&#xff09; 2019年5月22日 学院 计算机科学与网络工程学院 年级、专业、班 计科172 姓名 学号 实验课程名称 数据库原理实验 成绩 实验项目名称 用户权限管理…

前端学习(1801):前端调试之清除浮动练习3

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

Java编程思想学习(一) 一切都是对象

前言 Java是基于C的&#xff0c;但Java是一种更加纯粹的面向对象程序设计语言。 C和Java都是混合&#xff0f;杂合型语言。杂合型语言允许多种编程风格。 用引用操纵对象 每种编程语言都有自己操纵内存中元素的方式。 直接操纵元素用某种基于特殊语法的间接表示&#xff08;C和…

C++学习笔记之对文件的操作1

转载自** https://www.cnblogs.com/uniqueliu/archive/2011/08/03/2126545.html ** 前言 我们在编写程序的时候&#xff0c;最密不可分的就是对文件进行相应的操作&#xff0c;我们可以从文件中读取数据&#xff0c;可以将数据保存到文件&#xff0c;可以…… 总而言之&…

C++学习笔记之对文件的操作2

转载自** https://www.cnblogs.com/uniqueliu/archive/2011/08/03/2126680.html ** 什么都不说了&#xff0c;继续《C学习笔记之对文件的操作<1>》的内容… 功能展示 打开文件的方式 当我们想要打开的文件不存在的时候&#xff0c;一般地&#xff0c;ofstream类的对象…

前端学习(1802):前端调试之事件伪类练习

index.html <!DOCTYPE html> <html lang"en"><head> <!--系统内置 start--> <script type"text/javascript"></script> <!--系统内置 end--><meta charset"UTF-8"><title>练习</titl…

前端学习(1809):前端调试之微博头部开发

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>微博实战--head&l…

数据结构实验四 排序算法的实现

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼416&#xff09; 2019年6月4日 学院 计算机科学与教育软件学院 年级、专业、班 姓名 学号 实验课程名称 数据结构实验 成绩 实验项目名称 实验四 排序算法 指导老…

数据结构实验五 查找算法的实现

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼416B&#xff09; 2019年6月11日 学院 计算机科学与教育软件学院 年级、专业、班 姓名 学号 实验课程名称 数据结构实验 成绩 实验项目名称 实验五 查找算法 指导…

前端学习(1811):前端调试之css装饰cursor练习

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

数据结构实验六 综合数据处理

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼416A&#xff09; 2019年6月14日 学院 计算机科学与教育软件学院 年级、专业、班 计算机大类 144班 姓名 学号 实验课程名称 数据结构实验 成绩 实验项目名称 实验六…

CSS中的text-shadow。

text-shadow&#xff08;文字投影&#xff09;&#xff0c;box-shadow&#xff08;容器投影&#xff09;&#xff0c;border-radius&#xff08;圆角&#xff09;这三个属性估计以后用的比较多&#xff0c;记录 一下。目前不支持IE系列&#xff08;不过可以使用其他方法实现&am…

前端学习(1803):前端调试之事件伪类练习二

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

数据结构课程设计 神秘国度的爱情故事

数据结构 课程设计报告 广州大学 计算机科学与网络工程学院 计算机系 17级计科专业2班 2019年6月30日 广州大学学生实验报告 开课学院及实验室&#xff1a;计算机科学与工程实验室 2019年07月01日 学院 计算机科学与网络工程学院 年级/专业/班 计科1…