定义邻接表存储的图类。
[实验要求]
(1)创建一个邻接表存储的图;
(2)返回图中指定边的权值;
(3)插入操作:向图中插入一个顶点,插入一条边;
(4)删除操作:从图中删除一个顶点,删除一条边;
(5)图的广度优先遍历;
(6)基于迪杰斯特拉算法求最短路径。【选作】
[截图]
-
实验例图
-
邻接表
- 操作截图
[实现代码]
一共四个文件 :AQueue.h、Graph_List.h、Graph_List.cpp和main.cpp
- AQueue.h(自己实现的队列,也可以用C++库中的标准队列需要将代码中的相关代码替换下)
#include<iostream>
using namespace std;
template<class T>
class AQueue {
private: int front; /*队首所在数组元素下标*/
int rear; /*新元素要插入的位置(下标)*/
int count; /*队列中元素个数*/
T* QArray; /*存放队列元素的数组*/
int size; /*存放队列的数组规模*/
public: AQueue(int MaxQueueSize = 10); /*构造函数*/
~AQueue(void) {
delete[] QArray; } /*析构函数*/
bool QInsert(const T& item); /*向队尾插入元素item*/
bool QDelete(T& item); /*删除队首元素并将该元素值保存至item*/
void QClear(void) {
front = rear = count = 0; } /*清空队列*/
bool QFront(T& item); /*存取队首元素值*/
bool isEmpty(void)const {
return count == 0; } /*检测队列是否为空*/
bool isFull(void)const {
return count == size; } /*检测队列是否为满*/
};
//构造函数
template<class T>
AQueue<T>::AQueue(int MaxQueueSize)
{
size = MaxQueueSize;
QArray = new T[MaxQueueSize];
front = 0; rear = 0; count = 0;
}
//将元素item插入队尾
template<class T>
bool AQueue<T>::QInsert(const T& item)
{
if (isFull())
{
cout << "Inserting into a full Queue!" << endl;
return false;
} //若队列已满
QArray[rear] = item; //添加队尾元素
rear = (rear + 1) % size; //修改对位指针
count++; //队列长度+1
return true;
}
//删除队首元素,并将其元素值赋给变量item
template<class T>
bool AQueue<T>::QDelete(T& item)
{
if (isEmpty())
{
cout << "Deleting from an empty queue!" << endl;
return false;
}
item = QArray[front];
front = (front + 1) % size; //front顺时针移动一格
count--; //队列长度-1
return true;
}
//将队首元素值赋给变量item
template<class T>
bool AQueue<T>::QFront(T& item)
{
if (isEmpty())
{
cout << "Reading from an empty queue!" << endl;
return false;
}
item = QArray[front];
return true;
}
- Graph_List.h
#ifndef _GRAPH_LIST_H
#define _GRAPH_LIST_H
#include<iostream>
using namespace std;
const int maxsize=256;
const int maxweight=1000;
struct Edge{
friend class Graph_List;
int VerAdj;
int cost;
Edge *link;
};
struct Vertex{
friend class Graph_List;
int VerName;
Edge *adjacent;
};
class Graph_List{
private:
Vertex *Head;
int size;
public:
Graph_List();
virtual ~Graph_List();
int getweight(const int&v1,const int&v2);
int getfirstneighbor(const int v);
int getnextneighbor(const int v1,const int v2);
void insterVertex(const int&v);
void insterEdge