实验四-图的应用——深度优先/广度优先搜索遍历 下载本文

内容发布更新时间 : 2024/11/10 4:35:13星期一 下面是文章的全部内容请认真阅读。

数据结构 实验报告

实验四 图的应用

一、 实验题目:

图的应用——深度优先/广度优先搜索遍历 二、 实验内容:

很多涉及图上操作的算法都是以图的遍历操作为基础的。试编写一个算法,实现图的深度优先和广度优先搜索遍历操作。

要求:以邻接矩阵或邻接表为存储结构,以用户指定的顶点为起始点,实现连通无向图的深度优先及广度优先搜索遍历,并输出遍历的结点序列。(注:学号为奇数的同学使用邻接矩阵存储结构实现,学号为偶数的同学使用邻接矩阵实现)

提示:首先,根据用户输入的顶点总数和边数,构造无向图,然后以用户输入的顶点为起始点,进行深度优先、广度优先搜索遍历,并输出遍历的结果。

三、程序源代码:

#include #include

#define MAX_VERTEX_NUM 20 #define OVERFLOW -1 int visited[80]; typedef struct ArcNode{

int adjvex; //该弧所指向的顶点的位置 struct ArcNode *nextarc; //指向下一条弧的指针

}ArcNode;

typedef struct VNode{

int data; //顶点信息

ArcNode *firstarc; //指向第一条依附该顶点的弧的指针

}VNode,AdjList[MAX_VERTEX_NUM]; typedef struct{

AdjList vertices;

int vexnum,arcnum;//图的当前顶点数和弧数

}ALGraph;

第 1 页 共 7 页

typedef struct QNode{

int data;

struct QNode *next;

}QNode,*QueuePtr; typedef struct{

QueuePtr front;//队头指针 QueuePtr rear;//队尾指针

}LinkQueue;

void InitQueue(LinkQueue &q) { }

void EnQueue(LinkQueue &q,int e) { }

int DeQueue(LinkQueue &q) {

int e;

//若队列不空,则删除q的队头元素,用e返回其值,并返回OK;否则返回ERROR

第 2 页 共 7 页

//构造一个空队列q

q.front=q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!q.front) exit(OVERFLOW); q.front->next=NULL;

//插入元素e为q的新的队尾元素 QueuePtr p;

p=(QueuePtr)malloc(sizeof(QNode)); if(!p) exit(OVERFLOW);//存储分配失败 p->data=e; p->next=NULL; q.rear->next=p; q.rear=p;

}

if(q.front==q.rear) return false; QueuePtr p; p=q.front->next; e=p->data;

q.front->next=p->next; if(q.rear==p) q.rear=q.front; free(p); return e;

bool QueueEmpty(LinkQueue &q)

{ //若队列q为空队列,则返回TRUE,否则返回FLASE }

int LocateVex(ALGraph G,int v) { }

//用邻接表构造无向图 void CreateDG(ALGraph &G) {

int i,j,k;

printf(\输入图的顶点数和弧度:\\n\scanf(\.arcnum);

第 3 页 共 7 页

if(q.front==q.rear) return true; else

return false;

int i;

for(i=0;i

if(G.vertices[i].data==v)

return i;