内容发布更新时间 : 2024/11/10 4:35:13星期一 下面是文章的全部内容请认真阅读。
数据结构 实验报告
实验四 图的应用
一、 实验题目:
图的应用——深度优先/广度优先搜索遍历 二、 实验内容:
很多涉及图上操作的算法都是以图的遍历操作为基础的。试编写一个算法,实现图的深度优先和广度优先搜索遍历操作。
要求:以邻接矩阵或邻接表为存储结构,以用户指定的顶点为起始点,实现连通无向图的深度优先及广度优先搜索遍历,并输出遍历的结点序列。(注:学号为奇数的同学使用邻接矩阵存储结构实现,学号为偶数的同学使用邻接矩阵实现)
提示:首先,根据用户输入的顶点总数和边数,构造无向图,然后以用户输入的顶点为起始点,进行深度优先、广度优先搜索遍历,并输出遍历的结果。
三、程序源代码:
#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;