数据结构--图的实验报告

  • 格式:doc
  • 大小:98.50 KB
  • 文档页数:10

下载文档原格式

  / 10
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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& G);

friend ostream & operator<<(ostream& out, Graphmtx& G);//输出

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::SeqQueue(int sz):front(0),rear(0),maxSize(sz)

{

//建立最大具有Maxsize个元素的空队列

elements=new T[maxSize]; //创建队列空间

assert(elements!=NULL); //断言:动态存储分配成功与否

}

template

bool SeqQueue::EnQueue(const T& x)

{

//若队列不满,则将元素X插入到该队列的队尾,否则出错处理

if(IsFull()==true)return false; //队列满则插入失败,返回

elements[rear]=x; //按照队尾指针指示位置插入

rear=(rear+1)%maxSize; //队尾指针加1

return true; //插入成功

}

template

bool SeqQueue::DeQueue(T& x)

{

//若队列不空则函数推掉一个对头元素并返回TRUE,否则函数返回FALSE if(IsEmpty()==true)return false; //若队列空则删除失败,返回

x=elements[front];

front=(front+1)%maxSize; //对头指针加1

return true; //删除成功

}

类的实现:

template

Graphmtx::Graphmtx(int sz, E max):maxWeight(max){ //构造函数maxVertices=sz;

numVertices=0;

numEdges=0;