数据结构实验报告-实验四 图的构造与遍历

实验四   图的构造与遍历

 

实验目的

1、图的的定义和遍历

(1)掌握图的邻接矩阵、邻接表的表示方法。

(2)掌握建立图的邻接矩阵的算法。

(3)掌握建立图的邻接表的算法。

(4)加深对图的理解,逐步培养解决实际问题的能力。

实验内容

1、图的定义和遍历

(一)基础题

1、编写图基本操作函数:

(1)CreateALGraph(ALGraph &G) 建立无向图的邻接表表示;

(2)LocateVex(ALGraph &G,char v)图查找信息;

(3)DFSTraverse(ALGraph &G)图的深度遍历操作

(4)BFSTraverse(ALGraph &G)图的广度优先遍历

(5)Create(MGraph &G)邻接矩阵的创建

2、调用上述函数实现下列操作:

(1)建立一个图的邻接矩阵和图的邻接表;

(2)采用递归深度优先遍历输出图的邻接矩阵;

(3)采用递归深度优先输出图的邻接表;

(4)采用图的广度优先遍历输出图的邻接表;

(5)采用图的广度优先遍历输出图的邻接表。

(二)提高题-

【问题描述】设某城市有n个车站,并有m条公交线路连接这些车站。假设这些公交车站都是单向的,这n个车站被顺序编号为0~n-1。在本程序中输入该城市的公交线路数,车站个数以及各公交线路上各站的编号。

【实现要求】求得从站0出发乘公交车至站n-1的最少换车次数。

实验结果

1、图的定义和遍历

(一)基础题

(1)画出数据结构基本运算的流程图

 
   

(2)程序运行主要结果截图

(3)程序源代码

#include<stdio.h>

#include<stdlib.h>

typedef struct ArcNode

{

int adjvex;  //邻接点域

struct ArcNode *nextarc; //指向下一个邻接点的指针域

int weight;

}ArcNode;//边结点

typedef struct VNode

{

char vertex;   //顶点域

ArcNode *firstarc;//第一条边的指针

}VNode,AdjList[10];//顶点结点向量

typedef struct

{

AdjList adjlist;

int vexnum,arcnum;

}ALGraph;

//图的邻接矩阵

typedef struct

{

int adj;

}AdjMatrix[10][10];

typedef struct

{

int vexs[10];

AdjMatrix arcs;

int vexnum,arcnum;

}MGraph;

int LocateVex(ALGraph &G,char v)//查找顶点信息

{

int k,j=0;

for(k=0;k<G.vexnum;k++)

if(G.adjlist[k].vertex==v)

{

j=k;

break;

}

return j;

}

void CreateALGraph(ALGraph &G)

{//建立无向图的邻接表表示

int i,j,k,w;

char v1,v2;

ArcNode *s;

printf("请输入顶点数和边数(vexnum,arcnum):");

scanf("%d,%d",&G.vexnum,&G.arcnum);

for(i=0;i<G.vexnum;i++)

{//建立顶点表

getchar();

printf("请输入第%d顶点信息:",i+1);

scanf("%c",&G.adjlist[i].vertex);//读入顶点信息

G.adjlist[i].firstarc=NULL;//边表置为空表

}

for(k=0;k<G.arcnum;k++)

{//建立边表

getchar();

printf("请输入第%d边的顶点对序号和边的权值(v1,v2,w):",k+1);

scanf("%c,%c,%d",&v1,&v2,&w);

j=LocateVex(G,v2);

i=LocateVex(G,v1);

s=(ArcNode*)malloc(sizeof(ArcNode)); //生成边表结点

s->adjvex=j;//邻接点序号为j

s->weight=w;//权值

s->nextarc=G.adjlist[i].firstarc;

G.adjlist[i].firstarc=s; //将新结点*s插入顶点vi的边表头部

//若图为无向图则加上下面的四句代码,若图为有向图则注释下面的四句代码

s=(ArcNode*)malloc(sizeof(ArcNode));

s->adjvex=i;

s->weight=w;

s->nextarc=G.adjlist[j].firstarc;

G.adjlist[j].firstarc=s;

}

}

bool visited[20];

int v;

void DFS(ALGraph &G,int v)//深度遍历输出

{

visited[v]=true;

printf("%c ",G.adjlist[v].vertex);

ArcNode *w;

for(w=G.adjlist[v].firstarc;w!=NULL;w=w->nextarc)

if(!visited[w->adjvex])

DFS(G,w->adjvex);

}

void DFSTraverse(ALGraph &G)//图的深度遍历操作

{

for(v=0;v<G.vexnum;v++)

visited[v]=false;

for(v=0;v<G.vexnum;v++)

if(!visited[v])

DFS(G,v);

}

//队列

typedef struct QNode

{

int data;

struct QNode *next;

}QNode,*QueuePtr;

typedef struct

{

QueuePtr front;

QueuePtr rear;

}LinkQueue;

void InitQueue(LinkQueue &Q)//构造一个空队列 Q

{

Q.rear=Q.front=(QueuePtr)malloc(sizeof(QNode));

Q.front->next=NULL;

}

void EnQueue(LinkQueue &Q,int e)//入队

{

QNode *p;

p=(QueuePtr)malloc(sizeof(QNode));

p->data=e;

p->next=NULL;

Q.rear->next=p;

Q.rear=p;

}

void DeQueue(LinkQueue &Q,int &e2)

{//出队

QNode *p;

p=Q.front->next;

e2=p->data;

Q.front->next=p->next;

if(Q.rear==p)

Q.rear=Q.front;

free(p);

}

bool visited1[20];

void BFSTraverse(ALGraph &G)//图的广度优先遍历

{

for(v=0;v<G.vexnum;v++)

visited1[v]=false;

LinkQueue Q;

InitQueue(Q);

for(v=0;v<G.vexnum;v++)

if(!visited1[v])

{

visited1[v]=true;

printf("%c ",G.adjlist[v].vertex);

EnQueue(Q,v);

int u;

ArcNode *w;

while(Q.front!=Q.rear)

{

DeQueue(Q,u);

for(w=G.adjlist[u].firstarc;w!=NULL;w=w->nextarc)

if(!visited1[w->adjvex])

{

visited1[w->adjvex]=true;

printf("%c ",G.adjlist[w->adjvex].vertex);

EnQueue(Q,w->adjvex);

}

}

}

}

void display(ALGraph &G)//输出图的顶点信息

{

printf("建立的邻接表位:\n");

int i;

for(i=0;i<G.vexnum;i++)

{

if(G.adjlist[i].firstarc!=NULL)

{

printf("%c->",G.adjlist[i].vertex);

ArcNode *p;

p=G.adjlist[i].firstarc;

while(p!=NULL)

{

printf("%d->",p->adjvex);

p=p->nextarc;

}

printf("NULL\n");

}

else

{

printf("%c->NULL\n",G.adjlist[i].vertex);

}

}

}

int LocateVex(MGraph &G,int v)

{

int k,j=0;

for(k=0;k<G.vexnum;k++)

if(G.vexs[k]==v)

{

j=k;

break;

}

return j;

}

void Create(MGraph &G)

{

int i,j,k;

int v1=0,v2=0,w=0;

printf("请输入图的顶点数:");

scanf("%d",&G.vexnum);

printf("请输入图的边数:");

scanf("%d",&G.arcnum);

for(i=0;i<G.vexnum;i++)

G.vexs[i]=i+1;

for(i=0;i<G.vexnum;i++)

for(j=0;j<G.vexnum;j++)

G.arcs[i][j].adj=0;

for(k=0;k<G.arcnum;k++)

{

printf("请输入一条边依附的顶点v1,v2及权值(v1,v2,w):");

scanf("%d,%d,%d",&v1,&v2,&w);

i=LocateVex(G,v1);

j=LocateVex(G,v2);

G.arcs[i][j].adj=w;

}

}

void display(MGraph &G)

{

int i,j;

for(i=0;i<G.vexnum;i++)

{

for(j=0;j<G.vexnum;j++)

printf("%d",G.arcs[i][j].adj);

printf("\n");

}

}

int main()

{

int z;

printf("请输入选择:\n-1-建立图的邻接矩阵\n-2-建立图的邻接表\n");

scanf("%d",&z);

if(z==1)

{

MGraph G;

Create(G);

display(G);

scanf("%d",&z);

}

if(z==2)

{

ALGraph G;

CreateALGraph(G);//建立无向图邻接表

display(G);//输出图的的顶点信息

printf("\n\n");

printf("图的深度遍历为:\n");

DFSTraverse(G);

printf("\n");

printf("\n\n");

printf("图的广度遍历为:");

BFSTraverse(G);

printf("\n");

}

}

(二)提高题

(1)画出数据结构基本运算的流程图

 
   

(2)程序运行主要结果截图

(3)程序源代码

#include<stdio.h>

#define M 20

#define N 50

int a[N+1];

int g[N][N];

int dist[N];

int m=0,n=0;

void buildG()//建图

{

int i,j,k,sc,dd;

while(1)

{

printf("输入公交线路数[1-%d],公交站数[1-%d]\n",M,N);

scanf("%d %d",&m,&n);

if(m>=1&&m<=M&&n>=1&&n<=N)

break;

}

for(i=0;i<n;i++)

for(j=0;j<n;j++)

g[i][j]=0;

for(i=0;i<m;i++)

{

printf("沿第%d条公交车线路前进方向的各站编号(0<=编号<=%d,-1结束):\n",i+1,n-1);

sc=0;

while(1)

{

scanf("%d",&dd);

if(dd==-1)

break;

if(dd>=0&&dd<n)

a[sc++]=dd;

}

a[sc]=-1;

for(k=1;a[k]>=0;k++)

for(j=0;j<k;j++)

g[a[j]][a[k]]=1;

}

}

int minLen()

{

int j,k;

for(j=0;j<n;j++)

dist[j]=g[0][j];

dist[0]=1;

while(1)

{

for(k=-1,j=0;j<n;j++)

if(dist[j]>0&&(k==-1||dist[j]<dist[k]))

k=j;

if(k<0||k==n-1)

break;

dist[k]=-dist[k];

for(j=1;j<n;j++)

if(g[k][j]==1&&(dist[j]==0||-dist[k]+1<dist[j]))

dist[j]=-dist[k]+1;

}

j=dist[n-1];

return(k<0?-1:j-1);

}

int main()

{

int t;

buildG();

t=minLen();

if(t<0)

printf("无解!\n");

else

printf("从0号站到%d站需换车%d次\n",n-1,t);

}

时间: 2024-10-03 19:37:22

数据结构实验报告-实验四 图的构造与遍历的相关文章

第六周总结 &amp; 实验报告(四)

第六周小结 一.instanceof关键字         在Java中使用instanceof关键字判断一个对象到底是哪个类的实例,返回boolean类型 1.instanceof关键字的作用 例class A{ public void fun1(){ System.out.println("A-->public void fun1(){}"); } public void fun2(){ this.fun1(); } } classB extends A{ public vo

第六周课程总结&amp;实验报告(四)

实验报告(四) 一.实验目的 1.掌握类的继承 2.变量的继承和覆盖,方法的继承,重载和覆盖的实现 二.实验的内容 1.根据下面的要求实现圆类Circle. 圆类Circle的成员变量:radius表示圆的半径. 圆类Circle的方法成员: Circle():构造方法,将半径置0 Circle(double r):构造方法,创建Circle对象时将半径初始化为r double getRadius():获得圆的半径值 double getPerimeter():获得圆的周长 void disp(

数据结构实验报告(四)

实验报告4 图的有关操作 无向网的创建.求度.深度遍历.广度遍历 1 #include <iostream> 2 #include <stdlib.h> 3 #include <stdio.h> 4 #include <string> 5 #define MAX_VERTEX_NUM 20 6 7 using namespace std; 8 //1.建立无向网的邻接表 9 10 typedef int InfoType;//权值 11 typedef ch

C语言实验报告(四)

C程序设计实验报告 姓名:杨静  实验地点:家  实验时间:2020.04.10 实验项目 1.用for语句实现循环 2.用while循环语句实现循环 3.用do-while语句实现循环 4.用while语句和for语句配合实现循环 5.用for语句嵌套实现循环 一.实验目的与要求 1.熟练地掌握while,do_while及for语句实现循环的方法. 2.了解3种循环语句的区别和转换.各自的适应性.循环嵌套的使用. 3.掌握如何在循环语句种使用break,continue语句,改变程序流程.

山东大学 机器学习 实验报告 实验2 模式分类 上机练习

[17级的同辈们,这是我实验报告真实且全部的内容,求求求求你们,不要让我后悔提前发布 ╥﹏╥... .真的挺简单的,1天就能搞定,而且在书里的位置我都标注出来了,让我们来一起学习吧!!!( ̄▽ ̄)",当然错了也概不负责哈~~~~] 3.实验内容及说明 使用上面给出的三维数据: 1. 编写程序,对类 1 和类 2 中的 3 个特征 x i 分别求解最大似然估计的均值???和方差?? ?2. 2. 编写程序,处理二维数据的情形??(??)~??(??,??).对类 1 和类 2 中任意两个特征的组合

实验报告 实验2 固件设计

北京电子科技学院(BESTI) 实     验    报     告 课程: 密码系统设计基础                                                               班级: 1352班.1353班 姓名:王玥.刘浩晨                                                                    学号:20135232.20135318 成绩:                      

数据结构实验报告-实验一 顺序表、单链表基本操作的实现

实验一    顺序表.单链表基本操作的实现   l  实验目的 1.顺序表 (1)掌握线性表的基本运算. (2)掌握顺序存储的概念,学会对顺序存储数据结构进行操作. (3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能力. l  实验内容 1. 顺序表 1.编写线性表基本操作函数: (1)InitList(LIST *L,int ms)初始化线性表: (2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插入元素: (3)DeleteList1

数据结构实验报告-实验五 查找

实验五   查找   l  实验目的 1. 查找的基本概念 掌握在数组上进行各种查找的方法和算法. 深刻理解各种方法的特点,并能灵活运用. 加深对查找的理解,逐步培养解决实际问题的能力. l  实验内容 1.查找的基本概念 (一)基础题 1.编写各种查找方法的基本操作函数: (1)search1(int *k,int n,int key)无序线性表的顺序查找: (2)search2(int *k,int n,int key)有序线性表的顺序查找: (3)bin_search(int *k,int

Java课程实验报告 实验四 Java网络编程及安全

北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计     班级:1352     姓名:吕松鸿  学号:20135229 成绩:                 指导教师:娄嘉鹏             实验日期:2015.6.9 实验密级:             预习程度:                   实验时间:15:50--20:50 仪器组次:29           必修/选修: 选修             实验序号:04 实验目的