图的邻接矩阵实现----修正版

本文补充了上次邻接矩阵实现中缺失的print()函数,经过测试已正常工作。后续将结合邻接表和多重表进行整合介绍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上次的那个邻接矩阵的实现点击打开链接没有给出print()函数等,这次都加上了,测试了,可以了。草草结束,写完邻接表和多重表之后再整合一下。:)

#include <iostream>
#include <vector>
#include <list>

using namespace std;
const int MaxSize = 12;
template <class T>
class Graph
{
private:
	list<T> vertexList;
	int edge[MaxSize][MaxSize];
	int numofVertex,
		numofArcs;
//	int findVertex(list<T> &l, const T& vertex);
	int getVertexPos(const T& vertex);

public:
	Graph(void);
	int numberOfVertices(void) const;
	int getWeight(const T& vertex1, const T& vertex2);
	T getVertex(int v);
	T& getNeighbors(const T& vertex);
	void insertVertex(const T& vertex);
	void insertEdge(const T& vertex1, const T& vertex2, int weight);
	void deleteVertex(const T& vertex);
	void deleteEdge(const T& vertex1, const T& vertex2);
	void print() const;
	
//	list<T>& BFS(const T& vertex);
//	void DFS();
//	void DFS(const int v, int visited[]);
};
template <class T>
void Graph<T>::print() const
{
	list<T>::const_iterator iter = vertexList.begin();//这里特别注意,之前写过,const函数,迭代器也要用const_iterator
	for(;iter != vertexList.end(); iter++)
	{
		cout << *iter << "   ";
	}
	cout << endl;
	for(int i =0;i<MaxSize; ++i)
	{
		for(int j = 0; j< MaxSize; ++j)
			cout << edge[i][j] << "   ";
		cout << endl;
	}
}
template <class T>
Graph<T>::Graph(void)
{
	for(int i =0;i<MaxSize; ++i)
	{
		for(int j = 0; j< MaxSize; ++j)
			edge[i][j] = 0;
	}

	numofVertex = 0;
	numofArcs   = 0;
}
template <class T>
int Graph<T>::getVertexPos(const T& vertex)
{
	list<T>::iterator iter = vertexList.begin();
	int count = 1;
	while(iter != vertexList.end() && *iter++ != vertex)
		count++;
	return count;
}
template <class T>
int Graph<T>::numberOfVertices(void) const
{
	return numofVertex;
}
template <class T>
int Graph<T>::getWeight(const T& vertex1, const T& vertex2)
{
	int pos1 = getVertexPos(vertex1),
		pos2 = getVertexPos(vertex2);
	if(pos1 == -1 || pos2 == -1)
	{
		cerr << "Error!" << endl;
		return -1;
	}
	return edge[pos1][pos2];
}
template <class T>
T& Graph<T>::getNeighbors(const T& vertex)
{
	list<T> temp;
	cout << endl;
	return temp;
}
template <class T>
void Graph<T>::insertEdge(const T& vertex1, const T& vertex2, int weight)
{
	int pos1 = getVertexPos(vertex1),
		pos2 = getVertexPos(vertex2);
	if(pos1 == -1 || pos2 == -1)
	{
		cerr << "Error!" << endl;
		return;
	}
	edge[pos1][pos2] = weight;
}
template <class T>
void Graph<T>::insertVertex(const T& vertex)
{
	if(numofVertex + 1 > MaxSize)
	{
		cerr << "Error2!" << endl;
		exit(1);
	}
	vertexList.push_back(vertex);
	numofVertex++;
}
template <class T>
T Graph<T>::getVertex(int v)
{
	list<T> temp;

	cout << endl;
	return temp;
}
template <class T>
void Graph<T>::deleteVertex(const T& vertex)
{
	int pos = getVertexPos(vertex);
	int row,
		col;
	if(-1 == pos)
	{
		cerr << "Error3!" << endl;
		return;
	}
	list<T>::iterator iter = vertexList.begin();
	while(iter != vertexList.end() && *iter != vertex);
	vertexList.erase(vertex);
	numofVertex--;
	for(row =0; row < pos; row++)
	{
		for(col = pos+1; col < numofVertex; col++)
		{
			dege[row][col-1] = edge[row][col];
		}
	}
	for(row =pos+1; row < numofVertex; row++)
	{
		for(col = pos+1; col < numofVertex; col++)
		{
			dege[row-1][col-1] = edge[row][col];
		}
	}
	for(row =pos+1; row < numofVertex; row++)
	{
		for(col = 0; col < pos; col++)
		{
			dege[row-1][col] = edge[row][col];
		}
	}	
}
template <class T>
void Graph<T>::deleteEdge(const T& vertex1, const T& vertex2)
{
	insertEdge(vertex1, vertex2, 0);
}
int main(void)
{	
	Graph<int> g;
	g.insertVertex(0);
	g.insertVertex(1);
	g.insertVertex(2);

	g.insertEdge(0,1,2);
	g.insertEdge(1,2,3);
	g.insertEdge(0,2,1);
	g.print();

	return 0;
}


 

你给的代码还是结果显示异常,而且,你把我的可视化和路径打印给弄没了。 >> umtitled2 请输入的顶点数量(2-8):5 请输入边的连接对(例:输入"1 2"表示顶点1和2相连) 输入完成后请直接按回车 --------------------------------------------- 1 2 2 3 3 4 4 5 2 4 已添加边 1-2 当前邻接矩阵: 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 已添加边 2-3 当前邻接矩阵: 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 已添加边 3-4 当前邻接矩阵: 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 已添加边 4-5 当前邻接矩阵: 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 已添加边 2-4 当前邻接矩阵: 0 1 0 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 0 生成的邻接矩阵: 0 1 0 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 0 === 判定结果 === 该不是欧拉或半欧拉 >> umtitled2 请输入的顶点数量(2-8):3 请输入边的连接对(例:输入"1 2"表示顶点1和2相连) 输入完成后请直接按回车 --------------------------------------------- 1 2 2 3 3 1 1 3 已添加边 1-2 当前邻接矩阵: 0 1 0 1 0 0 0 0 0 已添加边 2-3 当前邻接矩阵: 0 1 0 1 0 1 0 1 0 已添加边 3-1 当前邻接矩阵: 0 1 1 1 0 1 1 1 0 已添加边 1-3 当前邻接矩阵: 0 1 2 1 0 1 2 1 0 函数或变量 'find_eulerian_paths' 无法识别。 出错 umtitled2>analyze_graph (第 64 行) paths = find_eulerian_paths(adjMatrix, oddNodes(1), oddNodes(2)); 出错 umtitled2 (第 4 行) [graphType, paths] = analyze_graph(adjMatrix, n);
05-28
//算法6.5 采用邻接矩阵表示的深度优先搜索遍历 #include <iostream> using namespace std; #define MVNum 100 //最大顶点数 typedef char VerTexType; //假设顶点的数据类型为字符型 typedef int ArcType; //假设边的权值类型为整型 #define MAXQSIZE 100 //最大队列长度 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; bool visited[MVNum]; //访问标志数组,其初值为"false" //------------邻接矩阵------------------ typedef struct{ VerTexType vexs[MVNum]; //顶点表 ArcType arcs[MVNum][MVNum]; //邻接矩阵 int vexnum,arcnum; //的当前点数和边数 }AMGraph; int FirstAdjVex(AMGraph G , int v); //返回v的第一个邻接点 int NextAdjVex(AMGraph G , int v , int w); //返回v相对于w的下一个邻接点 int LocateVex(AMGraph G , VerTexType v){ //确定点v在G中的位置 for(int i = 0; i < G.vexnum; ++i) if(G.vexs[i] == v) return i; return -1; }//LocateVex void CreateUDN(AMGraph &G){ //采用邻接矩阵表示法,创建无向网G int i , j , k; cout <<"请输入总顶点数,总边数,以空格隔开:"; cin >> G.vexnum >> G.arcnum; //输入总顶点数,总边数 cout << endl; cout << "输入点的名称,如a" <<endl; for(i = 0; i < G.vexnum; ++i){ //依次输入点的信息 } cout << endl; for(i = 0; i < G.vexnum; ++i) //初始化邻接矩阵,边的权值均置为极大值MaxInt for(k = 0; k < G.arcnum;++k){ //构造邻接矩阵 VerTexType v1 , v2; //置<v1, v2>的对称边<v2, v1>的权值为w }//for }//CreateUDN void DFS(AMGraph G, int v){ cout<<v;visited[v] = true; for(w=0;w<G.vexnum;w++) if((G.arcs[v][w]!=0)&&(!visited[w])) DFS_AM(G,w); }//DFS void show(AMGraph G){ } //----队列的定义及操作-------- typedef struct{ ArcType *base; //初始化的动态分配存储空间 int front; //头指针,若队列不空,指向队头元素 int rear; //尾指针,若队列不空,指向队尾元素的下一个位置 }sqQueue; Status InitQueue(sqQueue &Q){ //构造一个空队列Q Q.base = new ArcType[MAXQSIZE]; if(!Q.base) return ERROR; //存储分配失败 Q.front = Q.rear = 0; return OK; }//InitQueue void EnQueue(sqQueue &Q, ArcType e){ //插入元素e为Q的新的队尾元素 if((Q.rear + 1) % MAXQSIZE == Q.front) return; Q.base[Q.rear] = e; Q.rear = (Q.rear + 1) % MAXQSIZE; }//EnQueue bool QueueEmpty(sqQueue Q){ //判断是否为空队 if(Q.rear == Q.front) return true; return false; }//QueueEmpty void DeQueue(sqQueue &Q, ArcType &u){ //队头元素出队并置为u u = Q.base[Q.front]; Q.front = (Q.front + 1) % MAXQSIZE; }//DeQueue int FirstAdjVex(AMGraph G , int v){ //返回v的第一个邻接点 }//FirstAdjVex int NextAdjVex(AMGraph G , int u , int w){// 0 1 1 0 1 //返回v相对于w的下一个邻接点 }//NextAdjVex void BFS (AMGraph G, int v){ //按广度优先非递归遍历连通G sqQueue Q; ArcType u; ArcType w; cout << G.vexs[v] << " "; visited[v] = true; //访问第v个顶点,并置访问标志数组相应分量值为true InitQueue(Q); //辅助队列Q初始化,置空 EnQueue(Q, v); //v进队 }//BFS int main(){ cout << "************算法6.5 采用邻接矩阵表示的深度优先搜索遍历**************" << endl << endl; AMGraph G; CreateUDN(G); cout << endl; cout << "无向G创建完成!" << endl << endl; show(G); int i; VerTexType c; return 0; }//main 根据《数据结构》(C语言第二版)书中的内容来填补代码的空缺,不额外进行修改
05-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值