实验六:图的遍历与最小生成树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六图的邻接矩阵存储和最小生成树
一、实验目的
1.掌握图的邻接矩阵存储结构(或邻接表)
2.掌握图的深度优先遍历和广度优先遍历算法
2.掌握图的最小生成树算法(Prim算法)
二、实验内容
按下图所示无向带权图,实现以下各项功能。
图1 无向带权图
1.用图的邻接矩阵(或者邻接表)的方式存储图1的无向带权图。
2.输出该无向带权图的顶点序列以及权值集合(采用邻接矩阵存储)。
3.分别采用深度优先和广度优先算法遍历该无向图
4.采用Prim算法求该无向带权图的最小生成树。
要求:实验后用专用实验纸书写报告。报告中要说明实验题目,内容;分析实验过程,总结实验结果。
三、设计指导
1)创建一个头文件seqlist.h用来保存顺序表相关函数。
#define MaxSize 100
typedef char DataType;
typedef struct
{
DataType list[MaxSize];
int size;
}SeqList;
//初始化ListInitiate(L)
void ListInit(SeqList *L)
{
L->size = 0; /*定义初始数据元素个数*/
}
//求当前数据元素个数ListLength(L)
int ListLength(SeqList L)
{
return L.size;
}
//插入数据元素ListInsert(L, i, x)
int ListInsert(SeqList *L, int i, DataType x)
{
int j;
for(j = L->size; j > i; j--)
L->list[j] = L->list[j-1]; /*依次后移*/ L->list[i] = x; /*插入x*/
L->size ++; /*元素个数加1*/
return 1;
}
//删除数据元素ListDelete(L, i, x)
int ListDelete(SeqList *L, int i, DataType *x)
{
int j;
*x = L->list[i]; /*保存删除的元素到x中*/ for(j = i +1; j <= L->size-1; j++)
L->list[j-1] = L->list[j]; /*依次前移*/
L->size--; /*数据元素个数减1*/ return 1;
}
//取数据元素ListGet(L, i, x)
int ListGet(SeqList L, int i, DataType *x)
{
if(i < 0 || i > L.size-1)
{
printf("参数i不合法! \n");
return 0;
}
else
{
*x = L.list[i]; return 1;
}
}
2)创建一个头文件seqcqueue.h用来保存循环队列相关函数。#include
#define MaxQueueSize 20
typedef struct
{
DataType queue[MaxQueueSize];
int rear;
int front;
int count;
} SeqCQueue;
//初始化QueueInit(Q)
void QueueInit(SeqCQueue *Q)
{
Q->rear = 0;
Q->front = 0;
Q->count = 0;
}
//非空否QueueNotEmpty(Q)
int QueueNotEmpty(SeqCQueue Q)
{
if(Q.count != 0) return 1;
else return 0;
}
//入队列QueueAppend(Q, x)
int QueueAppend(SeqCQueue *Q, DataType x)
{
if(Q->count > 0 && Q->rear == Q->front) { printf("队列已满无法插入! \n");
return 0;
}
else
{ Q->queue[Q->rear] = x;
Q->rear = (Q->rear + 1) % MaxQueueSize;
Q->count++;
return 1;
}
}
//出队列QueueDelete(Q, d)
int QueueDelete(SeqCQueue *Q, DataType *d)
{
if(Q->count == 0)
{ printf("队列已空无数据元素出队列! \n");
return 0;
}
else
{ *d = Q->queue[Q->front];
Q->front = (Q->front + 1) % MaxQueueSize;
Q->count--;
return 1;
}
}
//取队头数据元素QueueGet(Q, d)
int QueueGet(SeqCQueue Q, DataType *d)
{
if(Q.count == 0)
{ printf("队列已空无数据元素可取! \n");
return 0;
}
else
{ *d = Q.queue[Q.front];
return 1;
}
}
3)主函数中包含的部分函数
#include
#include
#include "SeqList.h"
#include"SeqCQueue.h"
#define MaxWeight 10000