数据结构--图的实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图的实验报告
班级:电子091 学号:0908140620 姓名:何洁编号:19
(一)实验要求
创建一个图。能够实现图的输入,插入顶点和边,利用队列进行深度和广度遍历。(二)需求分析
功能:1,输入图的信息;2,插入一个顶点;3插入一个边;4,删除一个顶点;5,删除一个边;6,深度优先遍历;7,广度优先遍历;8退出。
(三)概要设计
本程序采用的是模板类,抽象数据类型有:T,E。
类:
template
class Graphmtx {
friend istream & operator>>(istream& in,Graphmtx
friend ostream & operator<<(ostream& out, Graphmtx
public:
Graphmtx(int sz=30, E max=0); //构造函数
~Graphmtx () //析构函数
{ delete []VerticesList; delete []Edge; }
T getValue (int i) {
//取顶点i 的值, i 不合理返回0
return i >= 0 && i <= numVertices ?
V erticesList[i] : NULL;
}
E getWeight (int v1, int v2) { //取边(v1,v2)上权值
return v1 != -1 && v2 != -1 ? Edge[v1][v2] : 0;
}
int NumberOfEdges(){return numEdges;} //返回当前边数
int NumberOfVertices(){return numVertices;} //返回当前顶点
int getFirstNeighbor (int v);
//取顶点v 的第一个邻接顶点
int getNextNeighbor (int v, int w);
//取v 的邻接顶点w 的下一邻接顶点
bool insertVertex (const T& vertex);
//插入顶点vertex
bool insertEdge (int v1, int v2, E cost);
//插入边(v1, v2),权值为cost
bool removeVertex (int v);
//删去顶点v 和所有与它相关联的边
bool removeEdge (int v1, int v2);
//在图中删去边(v1,v2)
int getVertexPos (T vertex) {
//给出顶点vertex在图中的位置
for (int i = 0; i < numVertices; i++)
if (VerticesList[i] == vertex) return i;
return -1;
}
//int numVertexPos(T vertex);
private:
int maxVertices;
int numEdges;
int numVertices;
T *VerticesList; //顶点表
E **Edge; //邻接矩阵
const E maxWeight;
};
(四)详细设计
函数通过调用图类中的函数实现一些功能。
头文件:
#include
#include
const int maxSize=50;
const int DefaultVertices=30; //最大顶点数(=n) const int maxWeight=50;
其中顺序队列的实现:
template
class SeqQueue
{
//循环队列的类的定义
public:
SeqQueue(int sz=10); //构造函数
~SeqQueue(){delete[] elements;} //析构函数
bool EnQueue(const T& x);
//若队列不满,则将X进队,否则队溢出处理
bool DeQueue(T& x);
//若队列不为空,则函数返回TRUE及对头元素的值,否则返回FALSE
void makeEmpty(){front=rear=0;}
//置空操作:对头指针和队尾指针置0
bool IsEmpty()const{return(front==rear)?true:false;}
//判队列空否,若队列空,则函数返回TRUE,否则返回FALSE
bool IsFull()const
{return((rear+1)%maxSize==front)?true:false;}
//判队列满否,若队列满,则函数返回TRUE,否则返回FALSE protected:
int rear,front; //对头和队尾指针
T *elements; //存放队列元素的数组
int maxSize; //队列最大可容纳元素个数
};
template
SeqQueue
{
//建立最大具有Maxsize个元素的空队列
elements=new T[maxSize]; //创建队列空间
assert(elements!=NULL); //断言:动态存储分配成功与否
}
template
bool SeqQueue
{
//若队列不满,则将元素X插入到该队列的队尾,否则出错处理
if(IsFull()==true)return false; //队列满则插入失败,返回
elements[rear]=x; //按照队尾指针指示位置插入
rear=(rear+1)%maxSize; //队尾指针加1
return true; //插入成功
}
template
bool SeqQueue
{
//若队列不空则函数推掉一个对头元素并返回TRUE,否则函数返回FALSE if(IsEmpty()==true)return false; //若队列空则删除失败,返回
x=elements[front];
front=(front+1)%maxSize; //对头指针加1
return true; //删除成功
}
类的实现:
template
Graphmtx
numVertices=0;
numEdges=0;