• 大小: 6KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-19
  • 语言: C/C++
  • 标签: 图结构  邻接表  

资源简介

使用邻接表实现图结构,无向的、有向的、无权的和有权的都可支持。

资源截图

代码片段和文件信息

#include
#include
using namespace std;
//最大权值
#define MAXWEIGHT 100
//边节点
typedef struct edgenode_tag
{
int adjvex;  //邻接点
int weight;  //边的权值
struct edgenode_tag *next;
}EdgeNode;
//顶点节点
typedef struct vertex_tag
{
int vertex;   //顶点
EdgeNode *next;
}Vertex;
class Graph
{
private:
//是否带权
bool isWeighted;
//是否有向
bool isDirected;
//顶点数
int numV;
//边数
int numE;
//邻接表
Vertex *adjList;
public:
/*
构造方法
numV是顶点数,isWeighted是否带权值,isDirected是否有方向
*/
Graph(int numV bool isWeighted = false bool isDirected = false);
//建图
void createGraph();
//析构方法
~Graph();
//获取顶点数
int getVerNums()
{return numV;}
//获取边数
int getEdgeNums()
{return numE;}
//插入边
void insertEdge(int tail int head int weight = 1);
void insertedge(int tail int head int weight);
//设置指定边的权值
void setEdgeWeight(int tail int head int weight);
//打印邻接表
void printAdjacentList();
//检查输入
bool check(int tail int head int weight = 1);
};
/*
构造方法
numV是顶点数,isWeighted是否带权值,isDirected是否有方向
*/
Graph::Graph(int numV bool isWeighted bool isDirected)
{
while (numV <= 0)
{
cout << “输入的顶点数不正确!,重新输入 “;
cin >> numV;
}
this->numV = numV;
this->isWeighted = isWeighted;
this->isDirected = isDirected;
//边数初始化为0
numE = 0;
adjList = new Vertex[numV];  //指针数组
for (int i = 0; i < numV; i++)
{
adjList[i].vertex = i;
adjList[i].next = NULL;
}
}
//建图
void Graph::createGraph()
{
//用一个新的变量表示边数,numE的修改则留到insertedge()中
int numEdge = 0;
cout << “输入边数 “;
while (cin >> numEdge && numEdge < 0)
cout << “输入有误!,重新输入 “;

int i j w;
if (!isWeighted)  //无权图
{
cout << “输入每条边的起点和终点:\n“;
for (int k = 0; k < numEdge; k++)
{
cin >> i >> j;
while (!check(i j))
{
cout << “输入的边不对!重新输入\n“;
cin >> i >> j;
}
insertEdge(i j);
}
}
else  //有权图
{
cout << “输入每条边的起点、终点和权值:\n“;
for (int k = 0; k < numEdge; k++)
{
cin >> i >> j >> w;
while (!check(i j w))
{
cout << “输入的边不对!重新输入\n“;
cin >> i >> j >> w;
}
insertEdge(i j w);
}
}
}
//析构方法
Graph::~Graph()
{
int i;
EdgeNode *p *q;
for (i = 0; i < numV; i++)
{
if (adjList[i].next)
{
p = adjList[i].next;
while (p)
{
q = p->next;
delete p;
p = q;
}
}
}
delete[]adjList;
}
//设置指定边的权值
void Graph::setEdgeWeight(int tail int head int weight)
{
if (!isWeighted)  //无权图
{
while (!check(tail head))
{
cout << “输入的边不对!重新输入\n“;
cin >> tail >> head;
}
insertEdge(tail head);
}
e

评论

共有 条评论