图的邻接表实现

还是直接从QQ空间把代码直接迁过来

#include 
   
   
    
    
using namespace std;

#define UNVISITED 0;
#define VISITED 1;
class Edge
{
public:
	int start,end;
	int weight;
	Edge()
	{
		start=end=weight=0;
	}
	Edge(int st,int en,int w)
	{
		start=st;
		end=en;
		weight=w;
	}
	bool operator > (Edge oneEdge)
	{
		if(weight>oneEdge.weight)
			return true;
		else
			return false;
	}
	bool operator < (Edge oneEdge)
	{
		if(weight
    
    
     
     0 && oneEdge.end>=0)
			return true;
		else
			return false;
	}
	int StartVertex(Edge oneEdge) //返回oneEdge的始点
	{
		return oneEdge.start;
	}
	int EndVertex (Edge oneEdge)
	{
		return oneEdge.end;
	}
	int Weight(Edge oneEdge)
	{
		return oneEdge.weight;
	}
	virtual void setEdge(int start,int end,int weight)=0;
	virtual void delEdge(int start,int end)=0;
	void DSF(int v)
	{
		Mark[v]=VISITED;
		cout<
     
     
      
      next;
			delete tmp;
		}
	}
	~EdgeList()
	{
		removeall();
	}
};

class ListGraph: public Graph
{
private :
	EdgeList *graList;//保存所有边表的数组
public :
	ListGraph(int verticesNum):Graph(verticesNum)
	{
		graList=new EdgeList [vertexNum];
	}
	~ListGraph()
	{
		delete []graList;
	}
	Edge FirstEdge(int oneVertex)
	{
		Edge tmpEdge;
		tmpEdge.start=oneVertex;
		ListNode *temp=graList[oneVertex].head;

		if(temp->next!=NULL)
		{
			tmpEdge.end=temp->next->element.vertex;
			tmpEdge.weight=temp->next->element.weight;
		}
		return tmpEdge;
	}
	Edge NextEdge(Edge oneEdge)
	{
		//返回与边oneEdge有相同关联顶点的下一条边
		Edge tmpEdge;
		tmpEdge.start=oneEdge.start;
		ListNode *temp=graList[oneEdge.start].head;

		while(temp->next!=NULL && temp->next->element.vertex<=oneEdge.end)
			temp=temp->next;
		if(temp->next!=NULL)
		{
			tmpEdge.end=temp->next->element.vertex;
			tmpEdge.weight=temp->next->element.weight;
		}
		return tmpEdge;
	}
	void setEdge(int start,int end,int weight)
	{
		ListNode *temp=graList[start].head;
		while(temp->next!=NULL && temp->next->element.vertex
      
      
       
       next;
		if(temp->next==NULL)
		{
			temp->next=new ListNode;
			temp->next->element.vertex=end;
			temp->next->element.weight=weight;
			edgeNum++;
			return;
		}
		if(temp->next->element.vertex==end) //边在边表中已存在
		{
			temp->next->element.weight;
			return;
		}
		if(temp->next->element.vertex>end) //边在边表中不存在,但在边表中其后存在其他边
			//则在边表中插入这条边
		{
			ListNode *other=temp->next;
			temp->next=new ListNode;
			temp->next->element.vertex=end;
			temp->next->element.vertex=end;
			temp->next->next=other;
			edgeNum++;
		}
	}
	void delEdge(int start,int end)
	{
		ListNode *temp=graList[start].head;
		while(temp->next!=NULL && temp->next->element.vertex
       
       
         next; if(temp->next==NULL) //边不存在,不需要任何操作 return; if(temp->next->element.vertex==end) //边存在,将其删掉 { ListNode *other=temp->next->next; delete temp->next; temp->next=other; edgeNum--; } } }; void main() { ListGraph a(5); a.setEdge(4,1,5); a.setEdge(3,4,6); a.setEdge(1,3,9); a.setEdge(3,2,2); a.DSFTraverse(); } 
       
      
      
     
     
    
    
   
   

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值