`
raojl
  • 浏览: 208410 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

邻接表实现状态图【大家帮忙看看问题】

阅读更多
StatusGrap.cpp
// StatusGraph.cpp: implementation of the StatusGraph class.
//
//////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "StatusGraph.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

/*
template<typename vertex>
StatusGraph<vertex>::~StatusGraph()
{}*/

template<typename vertex>
void StatusGraph<vertex>::erase_vertex(const vertex& v){
	adj_map::iterator m_iter = adj_map.find(v);
	if(m_iter == adj_map.end() ) return ;
	adj_map.erase(m_iter);

	m_iter =adj_map.begin();
	while (m_iter !=adj_map.end())
	{
		list<dest_vertex<vertex> > & edge_list = (*m_iter).second;
		list<dest_vertex<vertex> >::iterator list_iter = edge_list.begin();

		for (;list_iter != edge_list.end();list_iter ++)
		{
			if ( (*list_iter).dest == v )
			{
				edge_list.erase(list_iter);
				break;
			}
		}
		m_iter++;
	}
}

template<typename vertex>
int StatusGraph<vertex>::edge_count(){
	int count =0;
	graphMap::iterator m_iter = adj_map.begin();
	for (;m_iter != adj_map.end();m_iter ++)
	{
		count += (*m_iter).second.size();
	}
	if (d) return count;
	else return count / 2 ;
}

template<typename vertex>
int StatusGraph<vertex>::get_weight(const vertex &v1,const vertex &v2){
	graphMap::iterator iter =adj_map.find(v1);
	if (iter != adj_map.end() && adj_map.find(v2) != adj_map.end())
	{
		list<dest_vertex<vertex> >& edge_list = (*iter).second;
		list<dest_vertex<vertex> >::iterator list_iter = edge_list.begin();
		while(list_iter != edge_list.end()){
			if ((*list_iter).dest == v2)
			{
				return (*list_iter).weight;
			}
			list_iter++;
		}
	}
	return -1;
}

template<typename vertex>
void StatusGraph<vertex>::insert_edge(const vertex &v1,const vertex &v2,const int& weight){
	if (contains_edge(v1,v2)) return;
	insert_vertex(v1);
	insert_vertex(v2);
	list<dest_vertex<vertex> > & e_list1 = (*(adj_map.find(v1)) ).second;
	e_list1.push_back(dest_vertex<vertex>(v2,weight));
	if (d)
	{
		return ;
	}
	list<dest_vertex< vertex> >& e_list2 = (*(adj_map.find(v2))).second;
	e_list2.push_back(dest_vertex<vertex>(v1,weight));
}

template<typename vertex>
void StatusGraph<vertex>::erase_edge(const vertex& v1,const vertex&v2){
	graphMap::iterator iter = adj_map.find(v1);
	if (iter == adj_map.end() || adj_map.find(v2) == adj_map.end())
	{
		return ;// no node v1\v2
	}
	list<dest_vertex<vertex> >& e_list1 = (*iter).second;
	list<dest_vertex<vertex> >::iterator list_iter = e_list1.begin();
	for (; list_iter != e_list1.end(); list_iter ++)
	{
		if ((*list_iter).dest == v2 )
		{
			found = true;
			e_list1.erase(list_iter);
			break;
		}
	}
	if (d || !found) return;
	iter = adj_map.find(v2);
	list<dest_vertex<vertex> >& e_lsit2 = (*iter).second;
	list_iter = e_lsit2.begin();
	for (; list_iter != e_lsit2.end();list_iter ++)
	{
		if ((*list_iter).dest == v1)
		{
			e_lsit2.erase(list_iter);
			break;
		}
	}
}

template<typename vertex>
bool StatusGraph<vertex>::contains_edge(const vertex &v1,const vertex &v2){
	graphMap::iterator iter = adj_map.find(v1);
	if (iter != adj_map.end() && adj_map.find(v2) ! = adj_map.end())
	{
		list<dest_vertex<vertex> >& edge_list = (*iter).second;
		list<dest_vertex<vertex> >::iterator list_iter = edge_list.begin();
		for (;list_iter != edge_list.end(); list_iter ++)
		{
			if((*list_iter).dest == v2) return true;
		}
	}
	return false;
}

template<typename vertex>
istream& operator>>(istream&istr,StatusGraph<vertex> &g){
	cout << "待实现!" <<endl;
	return istr;
}

template<typename vertex>
ostream& operator<<(ostream&ostr,const StatusGraph<vertex>&g){
	g.output();
	return ostr;
}

template<typename vertex>
void StatusGraph<vertex>::output() const{
	cout << "待实现!" <<endl;
}

StatusGrap.h
#if !defined(AFX_STATUSGRAPH_H__239AC296_43C3_4CD4_A788_91E56564168C__INCLUDED_)
#define AFX_STATUSGRAPH_H__239AC296_43C3_4CD4_A788_91E56564168C__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <map>
#include <list>
#include <string>
#include <iostream>
using namespace std;


enum gkind {undigraph,digraph};

template<typename vertex>
struct dest_vertex 
{
	vertex dest;//顶点
	int weight;//权重
	dest_vertex(const vertex& x,const int& wet)
	{
		dest = x;
		weight =wet;
	}
	bool operator > (const dest_vertex<vertex> &e) const
	{
		return weight > e.weight;
	}
};

template<typename vertex>
class StatusGraph
{
public:
	StatusGraph(gkind t = digraph):d(t){}
	/*
	 *	
	 */
	StatusGraph(const StatusGraph& g){
		adj_map = g.adj_map;
	}
	/*
	 *	
	 */
	~StatusGraph(){};
	/**
	*	return this graph's size.
	*/
	int size(){
		return adj_map.size();
	}
	/**
	*	return this graph is empty or not !
	*/
	bool empty(){
		return adj_map.size() == 0;
	}
	/**
	*  check a vertex is own to the container or not .
	*/
	bool contain_vertex(const vertex &v){
		return adj_map.find(v) != adj_map.end();
	}
	/*
	 *	insert a vertex into the container.	
	 */
	void insert_vertex(const vertex& v)
	{
		if (adj_map.find(v)) == adj_map.end() )
		{
			adj_map[v] = list<dest_vertex<vertex>>();
		}
	}
	/**
	*	@author raojl
	*	@desc: what node you want to delete
	*	@Edit 2010.06.20
	*/
	void erase_vertex(const vertex& v);
	/*
	 *	
	 */
	int edge_count();
	/*
	 *
	 */
	bool contains_edge(const vertex &v1,const vertex &v2);

	/*
	 *	
	 */
	int get_weight(const vertex &v1,const vertex &v2);
	
	/*
	 *	
	 */
	void insert_edge(const vertex &v1,const vertex &v2,const int& weight);

	/*
	 *	
	 */
	void erase_edge(const vertex &v1,const vertex &v2);
	/*
	 *
	 */
	list<dest_vertex<vertex> > get_incident_edges(const vertex & v)const
	{
		return (*adj_map.find(v)).second;
	}
	/*
	 *	
	 */
	vertex first_vertex(){
		return (*adj_map.begin()).first;
	}
public:
	friend istream& operator>>(istream&istr,StatusGraph<vertex>& g);
	friend ostream& operator<<(ostream&ostr,const StatusGraph<vertex> &g);
	//void dfs_traversal();//深度优先搜索
	//void bfs_traversal();//广度优先搜索


private:
	typedef map<vertex,list< dest_vertex<vertex> > > graphMap;

	graphMap adj_map;
	gkind d;

	//list<vertex> dfs(vertex& start,map<vertex,bool>* visited);
	//list<vertex> bfs(vertex& start,map<vertex,bool>* visited);
	void output() const;

};

#endif // !defined(AFX_STATUSGRAPH_H__239AC296_43C3_4CD4_A788_91E56564168C__INCLUDED_)


int main(int argc, char* argv[])
{
	typedef char vertex;
	StatusGraph<vertex> tt(digraph);
    cin>>tt;
	cout << tt;
	return 0;
}

大家帮忙看看 << 和 >>重载有问题呢?

StdStudy.obj : error LNK2001: unresolved external symbol "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class StatusGraph<char> &)" (??5@YAAAV?$basi
c_istream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$StatusGraph@D@@@Z)

D:\StdStudy\StdStudy.cpp(30) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class StatusGraph<char>' (or there is no acceptable conversion)
Error executing cl.exe.
Creating browse info file...
分享到:
评论
2 楼 raojl 2010-06-28  
lijinyan3000 写道
这些代码自己实现的?

厉害!!

水平很高了!

全是迭代,厉害个毛!有空帮我看看问题!
1 楼 lijinyan3000 2010-06-28  
这些代码自己实现的?

厉害!!

水平很高了!

相关推荐

    图的邻接表存储C语言实现

    对于诸如图的着色问题等高级应用,邻接表提供了一种清晰且直观的解决方案,有助于简化算法设计和实现过程。掌握图的邻接表存储和操作,对于任何从事计算机科学或相关领域的专业人士来说都是必不可少的技能之一。

    图的邻接表实现.rar

    在C++中,图的常见实现方式之一是邻接表。本项目提供了一个C++实现的邻接表,能够处理有向图和无向图,并且使用了类模板来增强代码的通用性。以下是对这个项目的详细解释: 首先,邻接表是一种存储图的有效方式,...

    邻接链表法实现图C代码

    在C语言中,我们可以用多种方式来实现图,其中一种常见的方法就是邻接链表。本文将详细讲解如何使用邻接链表法来实现图,并介绍上述描述中的各项操作。 1. **创建图**:创建图通常涉及到定义节点(Vertex)和边...

    邻接表来实现图的存储

    采用邻接表来实现图的存储,并输入输出邻接表的信息,并用邻接表来实现图的广度优先遍历。

    实现图的邻接矩阵和邻接表存储

    在编程中,有多种方法来存储图,其中两种常用的方法是邻接矩阵和邻接表。这两种方法各有优缺点,适用于不同类型的图和不同的操作需求。 邻接矩阵是一种二维数组,其中的每个元素代表两个顶点之间是否存在边。如果...

    图的邻接表实现

    图的邻接表实现,用邻接矩阵实现了图,基本操作,主要算法

    图的邻接表c++表示

    通过以上分析可以看出,这段代码实现了基于邻接表的图的表示和操作。邻接表是一种高效存储稀疏图的方法,适用于边的数量远少于顶点数量的平方的情况。此外,代码还提供了随机生成边的功能,这对于测试图算法非常有用...

    图的邻接矩阵和邻接表实现

    Dijkstra算法适用于没有负权边的图,可以配合邻接矩阵或邻接表实现。对于邻接矩阵,可以直接访问权重;对于邻接表,可以使用优先队列(如二叉堆)来快速找到最小距离的节点。 总结来说,邻接矩阵和邻接表是图的主要...

    邻接矩阵,邻接表实现图的创建,遍历(DFS,BFS)

    本文将深入探讨如何使用邻接矩阵和邻接表这两种方法来创建图,并实现深度优先搜索(DFS)和广度优先搜索(BFS)算法。 首先,我们来看邻接矩阵。邻接矩阵是一个二维数组,其中的元素代表图中节点之间的连接状态。...

    邻接表表示的图的广度优先遍历

    《数据结构与算法(C++版)》先关 邻接表表示的图的广度优先遍历的动画演示

    图的邻接表存储 实现图的深度和广度优先搜索

    实现图的深度和广度优先搜索 /* 邻接表的结点类型 */ typedef struct arc {int adjvex; struct arc *next;}ArcNode; typedef struct VexNode {int vertex; ArcNode *firstarc; }VerNode; typedef VerNode ...

    用邻接多重表实现图遍历演示

    根据给定文件的信息,我们可以提炼出以下关于使用邻接多重表实现图遍历的相关知识点: ### 一、邻接多重表的基本概念 邻接多重表是一种用于存储无向图的数据结构,它通过在每个顶点处维护一个指向与之相连的所有边...

    邻接表存储的图

    1、 定义邻接表存储的图类。 2、 实验验证如下算法的正确性、各种功能及指标: 1)创建一个邻接表存储的图; 2)返回图中指定边的权值; 3)返回图中某顶点的第一个邻接顶点; 4)返回图中某顶点关于另一个顶点的下...

    用邻接表实现图的数据结构

    本篇将详细介绍如何使用邻接表来实现图,并以Windows 32位环境下的Visual Studio 2013为开发工具进行阐述。 邻接表是一种常用的图存储结构,相较于邻接矩阵,它更加节省空间,尤其对于稀疏图(边的数量远小于顶点...

    自动机nfa->dfa邻接表实现

    在编译原理中,自动机是一种重要的概念,用于识别和处理特定的语言或模式。自动机主要有两种类型:非确定性有限...通过邻接表这一数据结构,可以有效地组织和操作DFA的状态转移关系,从而实现高效的自动机识别功能。

    图的邻接表的实现带权路径

    建立有向图的邻接表更简单,每当读人一个顶点对序号 ,j&gt; 时,仅需生成一个邻接序号为j的边表结点,将其插入到vj的出边表头部即可。 同时没个节点带权访问。 邻接表的形式说明 typedef struct node{//边表结点  ...

    Dijkstra算法邻接表实现

    Dijkstra算法C++邻接表实现,用邻接表存图,还有记录路径。

    图的邻接矩阵存储和邻接表存储

    图是数据结构中的一种重要...综上所述,`createadjlist.cpp`和`creatematix.cpp`文件分别实现了图的邻接表和邻接矩阵存储,为理解和操作图提供基础。通过阅读和理解这些代码,你可以更好地掌握这两种重要的图数据结构。

    邻接表法建立图 程序代码

    邻接表法建立图程序代码 邻接表法是图的存储结构之一,通过建立邻接表来存储...邻接表法建立图程序代码是使用C++语言实现的,它可以快速地创建和输出图的信息。在实际应用中,邻接表法可以广泛应用于图的存储和处理。

    新建 DOC 文档_实现图的邻接矩阵和邻接表存储_doc_图的遍历算法_

    领会图的两种主要存储结构、图基本运算算法和两种遍历算法设计内容:编写一个程序,设计带权图的邻接矩阵与邻接表的创建和输出运算,并在此基础上设计一个主程序完成如下功能:(1)建立如图所示的有向图G的邻接矩阵...

Global site tag (gtag.js) - Google Analytics